Azure Key Vault を使用した MicroProfile の構成Configure MicroProfile with Azure Key Vault

このチュートリアルでは、MicroProfile 構成 API を使用して Azure Key Vault からシークレットを取得して Azure Key Vault に直接接続を作成するように、MicroProfile アプリケーションを構成する方法について説明します。This tutorial will demonstrate how to configure a MicroProfile application to retrieve secrets from Azure Key Vault using the MicroProfile Config APIs to create a direct connection to Azure Key Vault. MicroProfile 構成 API を使用すると、構成データを取得し、これをご自分のマイクロサービスに挿入する際に、開発者が標準 API のメリットを活かすことができます。By using the MicroProfile Config APIs, developers benefit from a standard API for retrieving and injecting configuration data into their microservices.

詳しく説明する前に、Azure Key Vault と MicroProfile 構成 API を組み合わせることで、コードで何を記述できるかを簡単に確認しましょう。Before we dive in, lets quickly take a look at what a combination of Azure Key Vault and the MicroProfile Config API enables us to write in our code. @Inject および @ConfigProperty の注釈が付いている、クラス内のフィールドのコード スニペットを次に示します。Here's a code snippet of a field in a class that has been annotated with @Inject and @ConfigProperty. 注釈で指定されている name は Azure Key Vault で検索するプロパティの名前で、キーが検出されない場合は、defaultValue が設定されます。The name specified in the annotation is the name of the property to look up in Azure Key Vault, and the defaultValue is what will be set if the key is not discovered. 最終的には、Azure Key Vault に格納されている値、または既定値が実行時にフィールドに自動的に挿入され、開発者の作業が簡略化されます。開発者がコンストラクターおよびセッター メソッドで値を渡す必要がなく、MicroProfile にこの処理を任すことができるからです。The end result is that the value stored in Azure Key Vault, or the default value, will be injected automatically into the field at runtime, simplifying the life of developers as they no longer need to pass values around in constuctors and setter methods, instead leaving it to MicroProfile to handle.

@Inject
@ConfigProperty(name = "key-name", defaultValue = "Unknown")
String keyValue;

MicroProfile 構成に直接アクセスし、必要に応じてシークレットを要求することもできます。次に例を示します。It is also possible to access the MicroProfile config directly, to request secrets as necessary, e.g.:

public class DemoClass {
    @Inject
    Config config;

    public void method() {
        System.out.println("Hello: " + config.getValue("key-name", String.class));
    }
}

このサンプルでは、Payara MicroMicroProfile を使用して、お使いのマシンでローカルに実行できる小さな Java war ファイルを作成します。This sample makes use of Payara Micro and MicroProfile to create a tiny Java war file that can be run locally on your machine. ここでは、コードを Docker 化したり Azure にプッシュしたりする方法については説明しませんが、このチュートリアルの最後にあるリンク セクションには、これについて説明した他の便利なチュートリアルへのリンクが記載されています。It does not demonstrate how to dockerise or push the code to Azure, but the links section at the end of this tutorial has links to other useful tutorials that explain this.

このサンプルでは、無料のオープン ソース ライブラリが使用されています。このライブラリによって、Azure Key Vault 用の構成ソースが (MicroProfile 構成 API を使用して) 作成されます。This sample makes use of a free and open source library that creats a config source (using the MicroProfile Config API) for Azure Key Vault. プロジェクト GitHub ページでは、このライブラリの詳細とコードを確認できます。You can learn more about this library, and review the code, on the project GitHub page. このライブラリを使用することで、このチュートリアルのコードの焦点を、ライブラリの構成だけに絞ることができます。その後、ご自身のコードにキーを挿入します。Azure 固有のコードを記述する必要はありません。By using this library, the code in this tutorial can simply focus on configuration of the library, followed by injecting keys into your code, and we don't need to write any Azure-specific code.

ここでは、お使いのローカル コンピューターで、このコードを実行するのに必要な手順を示します。最初は、Azure Key Vault リソースを作成します。Here are the steps required to run this code on your local machine, starting with creating an Azure Key Vault resource.

Azure Key Vault リソースの作成Creating an Azure Key Vault resource

Azure CLI を使用して Azure Key Vault リソースを作成し、1 つのシークレットを設定します。We will use the Azure CLI to create the Azure Key Vault resource and populate it with one secret.

  1. まず、Azure サービス プリンシパルを作成しましょう。Firstly, lets create an Azure service principal. これにより、Key Vault へのアクセスに必要なクライアント ID とキーが提供されます。This will provide us with the client ID and key we need to access Key Vault:
az login
az account set --subscription <subscription_id>

az ad sp create-for-rbac --name <service_principal_name>

たとえば、前の手順でサービス プリンシパル名として microprofile-keyvault-service-principal を使用したとします。Lets say we use microprofile-keyvault-service-principal for the service principal name in the previous step. これを行うと、Azure から次のようなフォームで応答があります (一部伏せ字になっています)。The response from Azure for doing this will be in the following, slightly censored, form:

{
  "appId": "5292398e-XXXX-40ce-XXXX-d49fXXXX9e79",
  "displayName": "microprofile-keyvault-service-principal",
  "name": "http://microprofile-keyvault-service-principal",
  "password": "9b217777-XXXX-4954-XXXX-deafXXXX790a",
  "tenant": "72f988bf-XXXX-41af-XXXX-2d7cd011db47"
}

ここで注目するのは appIDpassword の値です。これらはそれぞれ、client ID および key として後で使用します。Of particular note here is the appID and password values - these are what we will use later on as client ID and key, respectively.

サービス プリンシパルを作成したので、次は必要に応じてリソース グループを作成します (作成済みの場合、この手順はスキップできます)。Now that we have created a service principal, we can optionally create a resource group (if you already have one you want to use, you can skip this step). リソース グループの場所を取得するために、az account list-locations を呼び出し、そのリストの name 値を使用して、リソース グループの作成先を指定できることに注意してください。Note that to get a list of resource group locations, you can call az account list-locations and use the name value from that list to specify where the resource group should be created.

# For this tutorial, the author chose to use `westus`
# and `jg-test` for the resource group name.
az group create -l <resource_group_location> -n <resource_group_name>

ここで、Azure Key Vault リソースを作成します。We now create an Azure Key Vault resource. Key Vault 名は、後でキー コンテナーを参照するときに使用する名前です。したがって、覚えやすいものを選択してください。Note that the Key Vault name is what you will use to reference the key vault later, so choose something memorable.

az keyvault create --name <your_keyvault_name>            \
                   --resource-group <your_resource_group> \
                   --location <location>                  \
                   --enabled-for-deployment true          \
                   --enabled-for-disk-encryption true     \
                   --enabled-for-template-deployment true \
                   --sku standard

また、Key Vault シークレットにアクセスできるように、前に作成したサービス プリンシパルに適切なアクセス許可を付与する必要もあります。We also need to grant the appropriate permissions to the service principal we created earlier, so that it may access the Key Vault secrets. appID 値は、サービス プリンシパルを作成した上記の場所の appId 値です (つまり、5292398e-XXXX-40ce-XXXX-d49fXXXX9e79。ただし、ターミナル出力の値を使用)。Note that the appID value is the appId value from above where we created the service principal (that is, 5292398e-XXXX-40ce-XXXX-d49fXXXX9e79 - but use the value from your terminal output).

az keyvault set-policy --name <your_keyvault_name>   \
                       --secret-permission get list  \
                       --spn <your_sp_appId_created_in_step1>

これでシークレットを Key Vault にプッシュできます。We are now at the point where we can push a secret into Key Vault. キー名 demo-key を使用して、そのキーの値を demo-value に設定します。Lets use the key name demo-key, and set the value of the key to be demo-value:

az keyvault secret set --name demo-key      \
                       --value demo-value   \
                       --vault-name <your_keyvault_name>  

これで完了です。That's it! 現在、1 つのシークレットを使用して Azure で Key Vault が実行されています。We now have Key Vault running in Azure with a single secret. これで、このリポジトリを複製し、アプリでこのリソースを使用するように構成できます。We can now clone this repo and configure it to use this resource in our app.

ローカルでの起動と実行Getting up and running locally

この例は、GitHub で入手できるサンプル アプリケーションに基づいています。そこで、この例を複製して、コードをステップ実行します。This example is based on a sample application available on GitHub, so we will clone that and then step through the code. お使いのマシンにコードを複製するには、次の手順に従ってください。Follow the steps below to get the code cloned onto your machine:

  1. git clone https://github.com/Azure-Samples/microprofile-configsource-keyvault.git

  2. cd microprofile-configsource-keyvault

  3. src/main/resources/META-INF/microprofile-config.properties に移動し、上記の詳細を含む microprofile config.properties ファイルでプロパティを変更します。Navigate to src/main/resources/META-INF/microprofile-config.properties and change the properties in microprofile-config.properties file with details from above.

  4. mvn clean package payara-micro:start を使用して、サーバーを実行してみますTry running the server using mvn clean package payara-micro:start

  5. ご自身の Web ブラウザーで http://localhost:8080/keyvault-configsource/api/config にアクセスしてみます。Azure Key Vault から読み取られた値を示すシンプルな応答が表示されます。Try accessing http://localhost:8080/keyvault-configsource/api/config in your web browser - you should see a simple response that demonstrates values being read from Azure Key Vault.

まとめSummary

このサンプル アプリケーションでは、MicroProfile 構成 API、Azure Key Vault、および無料のオープン ソース microprofile-config-keyvault ライブラリを一緒に処理して、構成データとシークレットを MicroProfile Web サービスに簡単に挿入できるようにします。This sample application bakes together the MicroProfile Config API, Azure Key Vault, and the free and open source microprofile-config-keyvault library to enable easy injection of configuration data and secrets into our MicroProfile web services.