次の方法で共有


Terraform を使用してデプロイを実行するようにコンテナー イメージを構成する

この記事では、カスタム Terraform コンテナー イメージを構築し、Azure Deployment Environments (ADE) に環境定義をデプロイする方法を説明します。 Terraform のコードとしてのインフラストラクチャ (IaC) フレームワークを使ってインフラストラクチャをプロビジョニングするようにカスタム イメージを構成する方法について説明します。

環境定義は、少なくとも 2 つのファイル、すなわち、テンプレート ファイル (例: main.tf) とマニフェスト ファイル (environment.yaml という名前) で構成されます。 Terraform を使用する環境定義のデプロイは、コンテナーによって行います。

ADE 機能拡張モデルにより、カスタム コンテナー イメージを作成して環境定義で使用することができます。 この機能拡張モデルを使用すると、独自のカスタム イメージを作成し、それらのイメージをコンテナー レジストリ (DockerHub など) に格納できます。 その後、環境定義でこれらのイメージを参照して、環境をデプロイできます。

前提条件

カスタム Terraform コンテナー イメージを作成する

カスタム コンテナー イメージを作成すると、要件に合わせてデプロイをカスタマイズできます。

イメージのカスタマイズが完了したら、イメージをビルドし、それをコンテナー レジストリにプッシュする必要があります。

Docker を使用してコンテナー イメージを作成し、カスタマイズする

この例では、ADE で作成されたイメージのいずれかを基にして、ADE のデプロイを利用して ADE CLI にアクセスする Docker イメージをビルドする方法について説明します。

ADE CLI は、ADE の基本イメージを使ってカスタム イメージを構築できるツールです。 ADE CLI を使い、ワークフローに合わせてデプロイと削除をカスタマイズできます。 サンプル イメージには、ADE CLI がプレインストールされています。 ADE CLI について詳しくは、CLI カスタム ランナー イメージ リファレンスに関する記事をご覧ください。

ADE 用に構成されたイメージの作成は、次の手順に従って行います。

  1. ADE で作成されたサンプル イメージまたは FROM ステートメントを使って選んだ任意のイメージを基にして、イメージを作成します。
  2. RUN ステートメントを使って、イメージに必要なパッケージをインストールします。
  3. Dockerfile と同じレベルに scripts フォルダーを作成し、その中に deploy.shdelete.sh ファイルを格納して、作成されたコンテナー内でそれらのスクリプトを検出して実行できるようにします。 デプロイが ADE コア イメージを使って動作するためには、このステップが必要です。

FROM ステートメントを使用してサンプル コンテナー イメージを選択する

Microsoft アーティファクト レジストリでホストされているサンプル イメージを指す FROM ステートメントを、新しいイメージ用に作成される DockerFile に含めます。

サンプル コア イメージを参照する FROM ステートメントの例を次に示します。

FROM mcr.microsoft.com/deployment-environments/runners/core:latest

このステートメントは、最も新しく公開されたコア イメージをプルして、それをカスタム イメージの基礎にします。

Dockerfile に Terraform をインストールする

Terraform CLI を実行可能な場所にインストールして、デプロイと削除のスクリプトで使用できるようにできます。

Terraform CLI のバージョン 1.7.5 をインストールするプロセスの例を次に示します。

RUN wget -O terraform.zip https://releases.hashicorp.com/terraform/1.7.5/terraform_1.7.5_linux_amd64.zip
RUN unzip terraform.zip && rm terraform.zip
RUN mv terraform /usr/bin/terraform

ヒント

Hashicorp リリースから任意のバージョンの Terraform CLI のダウンロード URL を取得できます。

ADE サンプル イメージは Azure CLI イメージに基づいており、ADE CLI と JQ のパッケージがプレインストールされています。 詳しくは、Azure CLIJQ パッケージに関するページをご覧ください。

イメージ内で必要なパッケージをさらにインストールするには、RUN ステートメントを使います。

操作のシェル スクリプトを実行する

サンプル イメージ内では、操作名に基づいて操作が決定されて実行されます。 現在サポートされている 2 つの操作名は、deploydelete です。

この構造を利用するようにカスタム イメージを設定するには、Dockerfile のレベルで scripts という名前のフォルダー指定し、2 つのファイル deploy.shdelete.sh を指定します。deploy シェル スクリプトは環境の作成時または再デプロイ時に実行され、delete シェル スクリプトは環境の削除時に実行されます。 リポジトリ内のシェル スクリプトの例は、ARM-Bicep 用の Runner-Images フォルダーのイメージの下で確認できます。

これらのシェル スクリプトを確実に実行できるようにするには、Dockerfile に次の行を追加します。

COPY scripts/* /scripts/
RUN find /scripts/ -type f -iname "*.sh" -exec dos2unix '{}' '+'
RUN find /scripts/ -type f -iname "*.sh" -exec chmod +x {} \;

Terraform CLI を使用する操作シェル スクリプトを作成する

Terraform を使ってインフラストラクチャをデプロイするには、次の 3 つのステップがあります。

  1. terraform init - 作業ディレクトリ内でアクションを実行するように Terraform CLI を初期化します
  2. terraform plan - 受け取った Terraform インフラストラクチャ ファイルと変数および既存の状態ファイルに基づいてプランを作成し、.tf ファイルで指定されているインフラストラクチャを作成または更新するために必要な手順を作成します
  3. terraform apply - Azure でプランを適用して、新しいインフラストラクチャを作成するか、既存のものを更新します

コア イメージのエントリポイントの間に、既存の状態ファイルが、コンテナーと、環境変数 $ADE_STORAGE に保存されているディレクトリにプルされます。 さらに、変数 $ADE_OPERATION_PARAMETERS に格納されている現在の環境に対してパラメータが設定されます。 既存の状態ファイルにアクセスし、.tfvars.json ファイル内の変数を設定するには、次のコマンドを実行します。

EnvironmentState="$ADE_STORAGE/environment.tfstate"
EnvironmentPlan="/environment.tfplan"
EnvironmentVars="/environment.tfvars.json"

echo "$ADE_OPERATION_PARAMETERS" > $EnvironmentVars

さらに、ADE の特権によってサブスクリプション内にインフラストラクチャをデプロイするには、使用するスクリプトの中で、Terraform AzureRM プロバイダーを利用してインフラストラクチャをプロビジョニングするとき、マネージド サービス ID (MSI) を使用する必要があります。 特定のロールなど、デプロイを完了するためにデプロイで特別なアクセス許可が必要な場合は、環境のデプロイに使われているプロジェクト環境の種類の ID に、それらのアクセス許可を割り当てます。 関連する環境変数 (コア イメージのエントリポイント内のクライアント、テナント、サブスクリプションの ID など) は ADE によって設定されるため、プロバイダーで確実に ADE MSI が使われるように以下のコマンドを実行します。

export ARM_USE_MSI=true
export ARM_CLIENT_ID=$ADE_CLIENT_ID
export ARM_TENANT_ID=$ADE_TENANT_ID
export ARM_SUBSCRIPTION_ID=$ADE_SUBSCRIPTION_ID

テンプレート内で参照する他の変数が環境のパラメータで指定されていない場合は、プレフィックス TF_VAR を使って環境変数を設定します。 指定の ADE 環境変数の一覧には、Azure デプロイメント環境 CLI 変数リファレンスが提供されます。 それらのコマンドの例を次に示します。

export TF_VAR_resource_group_name=$ADE_RESOURCE_GROUP_NAME
export TF_VAR_ade_env_name=$ADE_ENVIRONMENT_NAME
export TF_VAR_env_name=$ADE_ENVIRONMENT_NAME
export TF_VAR_ade_subscription=$ADE_SUBSCRIPTION_ID
export TF_VAR_ade_location=$ADE_ENVIRONMENT_LOCATION
export TF_VAR_ade_environment_type=$ADE_ENVIRONMENT_TYPE

これで、前に示した手順を実行して Terraform CLI を初期化し、インフラストラクチャをプロビジョニングするプランを生成して、デプロイ スクリプトの間にプランを適用できます。

terraform init
terraform plan -no-color -compact-warnings -refresh=true -lock=true -state=$EnvironmentState -out=$EnvironmentPlan -var-file="$EnvironmentVars"
terraform apply -no-color -compact-warnings -auto-approve -lock=true -state=$EnvironmentState $EnvironmentPlan

削除スクリプトの間に、destroy フラグをプラン生成に追加して既存のリソースを削除できます。次にその例を示します。

terraform init
terraform plan -no-color -compact-warnings -destroy -refresh=true -lock=true -state=$EnvironmentState -out=$EnvironmentPlan -var-file="$EnvironmentVars"
terraform apply -no-color -compact-warnings -auto-approve -lock=true -state=$EnvironmentState $EnvironmentPlan

最後に、デプロイの出力をアップロードして、Azure CLI で環境にアクセスするときにアクセスできるようにするには、Terraform からの出力オブジェクトを、JQ パッケージを使って ADE で指定されている形式に変換します。 次の例で示すように、$ADE_OUTPUTS 環境変数に値を設定します。

tfOutputs=$(terraform output -state=$EnvironmentState -json)
# Convert Terraform output format to ADE format.
tfOutputs=$(jq 'walk(if type == "object" then 
            if .type == "bool" then .type = "boolean" 
            elif .type == "list" then .type = "array" 
            elif .type == "map" then .type = "object" 
            elif .type == "set" then .type = "array" 
            elif (.type | type) == "array" then 
                if .type[0] == "tuple" then .type = "array" 
                elif .type[0] == "object" then .type = "object" 
                elif .type[0] == "set" then .type = "array" 
                else . 
                end 
            else . 
            end 
        else . 
        end)' <<< "$tfOutputs")

echo "{\"outputs\": $tfOutputs}" > $ADE_OUTPUTS

カスタム イメージを ADE で利用できるようにする

Docker イメージをビルドし、それをコンテナー レジストリにプッシュして、ADE で使用できるようにする必要があります。 Docker CLI を使用するか、ADE から提供されるスクリプトを使用してイメージをビルドできます。

適切なタブを選択し、各アプローチの詳細を確認します。

レジストリにプッシュされるイメージをビルドする前に、コンピューターに Docker エンジンがインストールされていることを確認します。 その後、Dockerfile のディレクトリに移動して、次のコマンドを実行します。

docker build . -t {YOUR_REGISTRY}.azurecr.io/{YOUR_REPOSITORY}:{YOUR_TAG}

たとえば、customImage という名前のレジストリ内のリポジトリにイメージを保存し、1.0.0 のタグ バージョンを使ってアップロードする場合は、次のように実行します。

docker build . -t {YOUR_REGISTRY}.azurecr.io/customImage:1.0.0

Docker イメージをレジストリにプッシュする

カスタム イメージを使うには、匿名イメージ プルを有効にして、パブリックにアクセスできるイメージ レジストリを設定する必要があります。 このようにして、Azure Deployment Environments はコンテナー内のカスタム イメージにアクセスして実行できます。

Azure Container Registry は、コンテナー イメージおよび同様の成果物を格納する Azure オファリングです。

Azure CLI、Azure portal、PowerShell コマンドなどを使ってレジストリを作成するには、いずれかのクイックスタートのようにします。

レジストリで匿名イメージ プルを有効に設定するには、Azure CLI で次のコマンドを実行します。

az login
az acr login -n {YOUR_REGISTRY}
az acr update -n {YOUR_REGISTRY} --public-network-enabled true
az acr update -n {YOUR_REGISTRY} --anonymous-pull-enabled true

イメージをレジストリにプッシュする準備ができたら、次のコマンドを実行します。

docker push {YOUR_REGISTRY}.azurecr.io/{YOUR_IMAGE_LOCATION}:{YOUR_TAG}

環境定義にイメージを接続する

デプロイ内のカスタム イメージを使用する環境定義を作成するときは、マニフェスト ファイル (environment.yaml または manifest.yaml) で runner プロパティを編集します。

runner: "{YOUR_REGISTRY}.azurecr.io/{YOUR_REPOSITORY}:{YOUR_TAG}"

操作ログとエラーの詳細にアクセスする

ADE は、失敗したデプロイに関するエラーの詳細をコンテナー内の $ADE_ERROR_LOG ファイルに格納します。

失敗したデプロイのトラブルシューティングを行うには:

  1. 開発者ポータルにサインインします。

  2. デプロイに失敗した環境を特定して、[詳細の表示] を選びます。

    失敗したデプロイ エラーの詳細 (具体的にはストレージ アカウントの無効な名前) を示すスクリーンショット。

  3. [エラーの詳細] セクションでエラーの詳細を確認します。

    [詳細の表示] ボタンが表示されている、環境のデプロイ失敗を示すスクリーンショット。

さらに、Azure CLI の次のコマンドを使って、環境のエラーの詳細を表示できます。

az devcenter dev environment show --environment-name {YOUR_ENVIRONMENT_NAME} --project {YOUR_PROJECT_NAME}

環境のデプロイまたは削除の操作ログを表示するには、Azure CLI を使って環境の最新の操作を取得し、その操作 ID のログを表示します。

# Get list of operations on the environment, choose the latest operation
az devcenter dev environment list-operation --environment-name {YOUR_ENVIRONMENT_NAME} --project {YOUR_PROJECT_NAME}
# Using the latest operation ID, view the operation logs
az devcenter dev environment show-logs-by-operation --environment-name {YOUR_ENVIRONMENT_NAME} --project {YOUR_PROJECT_NAME} --operation-id {LATEST_OPERATION_ID}