Azure DevOps パイプラインからプライベート Amazon EKS クラスターにワークロードをデプロイする - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Azure DevOps パイプラインからプライベート Amazon EKS クラスターにワークロードをデプロイする

Mahendra Revanasiddappa、Amazon Web Services

概要

このパターンは、Azure DevOps パイプラインからプライベート Amazon Elastic Kubernetes Service (Amazon EKS) クラスターへの継続的インテグレーションと継続的デリバリー (CI/CD) を実装する方法を示しています。Amazon EKS クラスターのプライベート API サーバーエンドポイントに移行することで、セキュリティ体制を強化している組織が直面する重大な課題に対処します。

パブリックエンドポイントは、Kubernetes API サーバーをインターネットに直接公開し、悪意のある攻撃者がターゲットにする可能性のあるより大きな攻撃領域を作成します。プライベートエンドポイントに切り替えると、クラスターのコントロールプレーンへのアクセスは、顧客の Virtual Private Cloud (VPC) 内に限定されます。

Amazon EKS クラスターをプライベート API エンドポイントに移行するとセキュリティが大幅に強化されますが、Azure DevOps などの外部 CI/CD プラットフォームの接続の課題が生じます。プライベートエンドポイントには、クラスターの VPC またはピアネットワーク内からのみアクセスできます。したがって、 AWS プライベートネットワーク外で動作する標準の Microsoft がホストする Azure DevOps エージェントは、Kubernetes API サーバーに直接到達できません。これにより、クラスターへの接続を確立できないため、これらのエージェントで実行されている kubectl や Helm などのツールに依存する一般的なデプロイワークフローが中断されます。

この問題を解決するために、このパターンは、プライベート Amazon EKS クラスター内でセルフホスト型の Azure DevOps エージェントを使用して効率的なアプローチを示しています。このソリューションは、セキュリティ要件を維持しながら、優れたコスト最適化、運用効率、スケーラビリティを提供します。このアプローチは、特に、パフォーマンスやセキュリティを犠牲にすることなく、マルチクラウド DevOps プロセスを合理化しようとする企業にメリットをもたらします。

前提条件と制限

前提条件

  • アクティブ AWS アカウント。

  • AWS Command Line Interface (AWS CLI) バージョン 2.13.17 以降がインストールされています。

  • kubectl バージョン 1.25.1 以降がインストールされている。

  • 名前空間、シークレット、デプロイを作成するアクセス許可を持つプライベート Amazon EKS クラスターバージョン 1.24 以降が作成されました

  • インターネットへのアウトバウンド接続を持つ Amazon EKS クラスター内のワーカーノード。ワーカーノードで実行されている Azure DevOps エージェントを Azure DevOps エージェントプールに接続できるようにします。

  • GitHub アカウントが作成されました

  • Azure Pipelines と外部またはリモートサービス間の認証された接続であるサービス接続を設定するためのアクセス権を持つ Azure DevOps プロジェクトが作成されます

  • 前のポイントで説明した Azure DevOps プロジェクト用にインストールされた AWS Toolkit for Azure DevOps バージョン 1.15 以降。インストール手順については、Visual Studio Marketplace AWS Toolkit for Azure DevOpsの「」を参照してください。

制約事項

アーキテクチャ

このパターンでは、以下が作成されます。

  • Amazon ECR リポジトリ - Amazon Elastic Container Registry (Amazon ECR) リポジトリは、Azure DevOps エージェントとデプロイされたサンプルアプリを使用して Docker イメージを保存します。

  • Azure DevOps エージェントプール - Azure DevOps セルフホスト型エージェントプールは、プライベート Amazon EKS クラスターで実行されているエージェントを登録します。

  • IAM ロール - プライベート Amazon EKS クラスターで実行されているエージェントに必要なアクセスを提供する Azure サービス接続の AWS Identity and Access Management (IAM) ロール。

  • Azure DevOps サービス接続 - パイプラインジョブがアクセスするために必要なアクセスを提供する IAM ロールを使用する Azure DevOps アカウントのサービス接続 AWS のサービス。

次の図は、セルフホスト型の Azure DevOps エージェントをプライベート Amazon EKS クラスターにデプロイし、サンプルアプリケーションを同じクラスターにデプロイするアーキテクチャを示しています。

プライベート Amazon EKS クラスターへのセルフホスト型の Azure DevOps エージェントとサンプルアプリケーションのデプロイ。

この図表は、次のワークフローを示しています:

  1. セルフホスト型の Azure DevOps エージェントを Amazon EKS クラスター内のデプロイとしてデプロイします。

  2. Azure DevOps エージェントは、認証に個人用アクセストークン (PAT) を使用して Azure DevOps アカウントのエージェントプールに接続します。

  3. Azure Pipelines は、GitHub リポジトリのコードを使用してデプロイするパイプラインを設定します。

  4. パイプラインは、パイプライン設定で設定されたエージェントプールからエージェントで実行されます。Azure DevOps エージェントは、Azure DevOps アカウントに常にポーリングすることで、パイプラインのジョブ情報を取得します。

  5. Azure DevOps エージェントは、パイプラインジョブの一部として Docker イメージを構築し、そのイメージを Amazon ECR リポジトリにプッシュします。

  6. Azure DevOps エージェントは、 という名前空間のプライベート Amazon EKS クラスターにサンプルアプリケーションをデプロイしますwebapp

ツール

ツール

その他のツール

  • Docker は、オペレーティングシステムレベルの仮想化を使用してソフトウェアをコンテナで配信するサービスとしてのPlatform as a Service (PaaS) 製品のセットです。

  • kubectlは、Kubernetes クラスターに対してコマンドを実行するためのコマンドラインインターフェイスです。

コードリポジトリ

ベストプラクティス

エピック

タスク説明必要なスキル

Azure DevOps 組織 GUID を検索します。

Azure DevOps アカウントにサインインし、次の URL を使用して組織 GUID を検索します。URL https://dev.azure.com/{DevOps_Org_ID}/_apis/projectCollections?api-version=6.0 で、 を Azure DevOps 組織 ID {DevOps_org_ID}に置き換えます。

AWS DevOps

で IdP を設定します AWS アカウント。

Azure サービス接続 AWS アカウント の で ID プロバイダー (IdP) を設定するには、次の手順を実行します。

  1. にサインインし AWS Management Console、https://console.aws.amazon.com/iam/ で IAM コンソールを開きます。

  2. 左側のペインで、ID プロバイダーを選択します。

  3. [Add Provider (プロバイダを追加] を選択します。

  4. プロバイダータイプとして OpenID Connect を選択します。

  5. プロバイダー URL には、Azure DevOps 発行者 URL を入力します。Azure DevOps の各テナントには、OrganizationGUID通常次の形式を使用する一意の があります。 を Azure https://vstoken.dev.azure.com/{OrganizationGUID} DevOps 組織 ID {OrganizationGUID}に置き換えます。

  6. 対象者には、api://AzureADTokenExchange と入力します。これは Azure DevOps の固定値です。

  7. [Add Provider (プロバイダを追加] を選択します。

  8. 次のタスクで使用するために新しく作成されたプロバイダーの ARN を書き留めます。

詳細については、OpenID Connect を使用して Azure DevOps AWS から にフェデレーションする方法」を参照してください。

AWS DevOps

で IAM ポリシーを作成します AWS アカウント。

Azure DevOps パイプラインで使用される IAM ロールに必要なアクセス許可を付与する IAM ポリシーを作成するには、次の手順を実行します。

  1. IAM コンソールの左側のペインで、ポリシーを選択します。

  2. [ポリシーを作成] を選択します。

  3. アクセス許可の指定では、ポリシーエディタJSON を選択します。デフォルトの JSON ポリシーを次の JSON に置き換えます。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Action": [ "ecr:*", "eks:DescribeCluster", "eks:ListClusters" ], "Resource": "*" } ] }
  4. [次へ] を選択します。

  5. ポリシー名に、IAM ポリシーの名前を入力します。このパターンでは、ADO ポリシーという名前を使用します。

  6. [Create policy] (ポリシーの作成) を選択します。

AWS DevOps

で IAM ロールを作成します AWS アカウント。

Azure サービス接続 AWS アカウント の で IAM ロールを設定するには、次の手順を実行します。

  1. IAM コンソールの左側のペインで、ロールを選択します。

  2. [ロールの作成] を選択してください。

  3. 信頼されたエンティティタイプで、ウェブ ID を選択します。

  4. ドロップダウンリストから正しい IdP を選択します。IdP 名は で始まりますvstoken.dev.azure.com/{OrganizationGUID}

  5. 対象者ドロップダウンリストで、api://AzureADTokenExchange を選択します。

  6. このロールを 1 つのサービス接続のみに制限するには、条件を追加します。「Condition」で「Add condition」を選択し、「Key」で「vstoken.dev.azure.com/{OrganizationGUID}:sub」を選択します。Condition で、StringEquals を選択します。Value には、次の形式を使用します: sc://{OrganizationName}/{ProjectName}/{ServiceConnectionName}。にはServiceConnectionNameaws-sc を使用します。このサービス接続は次のタスクで作成します。

  7. [次へ] を選択します。

  8. アクセス許可を追加する で、前のタスクで作成したポリシーである ADO-policy を選択します。

  9. Next を選択し、Role nameado-role と入力します。Select Trusted Entities では、次の信頼ポリシーを使用します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::{account_id}:oidc-provider/vstoken.dev.azure.com/{OrganizationGUID}" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "vstoken.dev.azure.com/{OrganizationGUID}:aud": "api://AzureADTokenExchange", "vstoken.dev.azure.com/{OrganizationGUID}:sub": "sc://{OrganizationName}/{ProjectName}/{ServiceConnectionName}" } } } ] }

ポリシーで、次のプレースホルダーの情報を指定します。

  • {account_id} - AWS アカウント ID

  • {OrganizationGUID} - Azure DevOps Organization GUID

  • {OrganizationName} - Azure DevOps 組織名

  • {ProjectName} - Azure DevOps プロジェクト名

  • {ServiceConnectionName} - Azure DevOps サービス接続名。aws-sc を使用します。このサービス接続は次のタスクで作成します。

AWS DevOps

Azure DevOps アカウントにサービス接続を作成します。

Azure サービス接続を設定するには、次の手順を実行します。

  1. Azure DevOps プロジェクトで、プロジェクト設定サービス接続を選択します。

  2. 新しいサービス接続を選択し、サービス接続のタイプを として選択しaws、次を選択します。

  3. Role to Assume に、IAM ロール ado-role の arn を入力します。前のタスクで ado-role を作成しました。 で IAM ロールを作成します AWS アカウント

  4. OIDC の使用チェックボックスをオンにします。

  5. サービス接続名に、タスクプロパティに aws-sc と入力します。

  6. [保存] を選択します。

詳細については、Microsoft ドキュメントの「サービス接続の作成」を参照してください。

AWS DevOps

Amazon EKS 設定ファイルに IAM ロールを追加します。

IAM ロールには、Amazon EKS クラスターで必要なオペレーションを実行するために必要なアクセス許可が必要です。パイプラインロールであるため、IAM ロールはクラスター上のほぼすべてのタイプのリソースを管理できる必要があります。したがって、system:mastersグループアクセス許可はこのロールに適しています。

Kubernetes aws-auth ConfigMap内の に必要な設定を追加するには、次のコードを使用します。

- groups: - system:masters rolearn: arn:aws:iam::{account_id}:role/ADO-role username: ADO-role

を AWS アカウント ID {account_id}に置き換えます。

詳細については、Amazon EKS ドキュメントの「Amazon EKS と IAM の連携方法」を参照してください。

AWS DevOps
タスク説明必要なスキル

セルフホスト型エージェントプールを作成します。

Azure DevOps アカウントでセルフホスト型エージェントプールを設定するには、次の手順を実行します。

  1. Azure DevOps アカウント組織にサインインします。

  2. Azure DevOps Organization を選択します。

  3. Azure DevOps プロジェクトを選択します。

  4. [プロジェクト設定] を選択します。

  5. エージェントプールを選択します。

  6. プールの追加を選択します。

  7. セルフホストを選択します。

  8. Name eks-agent と入力します。

  9. すべてのパイプラインにアクセス許可を付与するチェックボックスをオンにします

  10. [作成] を選択します。

詳細については、Microsoft ドキュメントの「エージェントプールの作成と管理」を参照してください。

タスク説明必要なスキル

Amazon ECR リポジトリを作成します。

Azure DevOps エージェントとサンプルアプリケーション (webapp) をプライベート Amazon EKS クラスターにデプロイするために使用される Docker イメージは、Amazon ECR リポジトリに保存する必要があります。Amazon ECR リポジトリを作成するには、次の手順を実行します。

  1. https://console.aws.amazon.com/ecr/repositories で Amazon ECR コンソールを開きます。

  2. ナビゲーションバーから、リポジトリAWS リージョンを作成する を選択します。

  3. [リポジトリ] ページで、[プライベートリポジトリ] を選択し、次に [リポジトリの作成] を選択します。

  4. リポジトリ名にwebapp と入力します。このパターンのサンプルアプリケーションが機能するには、Amazon ECR リポジトリ名に webapp を使用する必要があります。リポジトリに別の名前を使用する場合は、「トラブルシューティング」を参照してください。

詳細については、「Amazon ECR ドキュメント」の「Creating an Amazon ECR private repository to store images」を参照してください。

AWS DevOps

Dockerfile を作成して Azure DevOps エージェントを構築します。

Dockerfile を作成して、Azure DevOps エージェントがインストールされている Docker イメージを構築します。次のコンテンツを という名前のファイルに保存しますDockerfile

FROM ubuntu:22.04 ENV TARGETARCH="linux-x64" RUN apt update && apt upgrade -y && apt install -y curl git jq libicu70 unzip wget RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" RUN unzip awscliv2.zip RUN ./aws/install RUN rm -rf aws awscliv2.zip RUN curl -sSL https://get.docker.com/ | sh RUN curl -sL https://aka.ms/InstallAzureCLIDeb | bash RUN mkdir -p azp WORKDIR /azp/ COPY ./start.sh ./ RUN chmod +x ./start.sh RUN useradd -m -d /home/agent agent RUN chown -R agent:agent /azp /home/agent RUN groupadd -f docker RUN usermod -aG docker agent USER agent ENTRYPOINT [ "./start.sh" ]
AWS DevOps

Azure DevOps エージェント用のスクリプトを作成します。

start.sh スクリプトを作成するには、次の手順を実行します。

  1. Microsoft ドキュメントの「Dockerfile を作成して構築する」の手順に移動し、ステップ 5 までスクロールします。次のコンテンツを に保存~/azp-agent-in-docker/start.sh、Unix スタイル (LF) の行末を使用してください

  2. スクリプトの内容をコピーし、Dockerfile start.shと同じディレクトリにある という名前のファイルに保存します。

AWS DevOps

Azure DevOps エージェントを使用して Docker イメージを構築します。

Azure DevOps エージェントをインストールする Docker イメージを作成するには、前に作成した Dockerfile を使用してイメージを構築します。Dockerfile が保存されているのと同じディレクトリで、次のコマンドを実行します。

aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com docker build --platform linux/amd64 -t ado-agent:latest . docker tag ado-agent:latest aws_account_id.dkr.ecr.region.amazonaws.com/webapp:latest docker push aws_account_id.dkr.ecr.region.amazonaws.com/webapp:latest

aws_account_id と を AWS アカウント ID と region に置き換えます AWS リージョン。

AWS DevOps
タスク説明必要なスキル

Azure 個人用アクセストークンを生成します。

プライベート Amazon EKS クラスターで実行されているエージェントには、Azure DevOps アカウントで認証できるように個人用アクセストークン (PAT) が必要です。PAT を生成するには、次の手順を実行します。

  1. Azure DevOps 組織で使用する予定のユーザーアカウント () でサインインしますhttps://dev.azure.com/{Your_Organization}

  1. ホームページから、ユーザー設定を開き、個人用アクセストークンを選択します。

  2. 新しいトークンを選択します。

  3. トークンの名前を入力します。

  4. すべてのスコープを表示 を選択します。

  5. エージェントプールで、読み取りと管理のチェックボックスをオンにします。

  6. [作成] を選択します。

  7. プライベート Amazon EKS クラスターにシークレットを作成するには、次の設定を使用します。

apiVersion: v1 kind: Secret metadata: name: azdevops-pat namespace: default type: Opaque stringData: AZP_TOKEN: <PAT Token>
  1. 設定を という名前のファイルに保存しますado-secret.yaml。を、先ほど作成した個人用アクセストークン<PAT Token>に置き換えます。シークレットを作成するには、次のコマンドを実行します。

kubectl create -f ado-secret.yaml

詳細については、Microsoft ドキュメントの「個人用アクセストークン (PAT) を使用してエージェントを登録する」を参照してください。

AWS DevOps

エージェントデプロイには Kubernetes マニフェストファイルを使用します。

Azure DevOps エージェントをプライベート Amazon EKS クラスターにデプロイするには、次のマニフェストファイルをコピーし、ファイルを として保存しますagent-deployment.yaml

apiVersion: apps/v1 kind: Deployment metadata: name: azure-pipelines-agent-eks labels: app: azure-pipelines-agent spec: replicas: 1 selector: matchLabels: app: azure-pipelines-agent template: metadata: labels: app: azure-pipelines-agent spec: containers: - name: docker image: docker:dind securityContext: privileged: true volumeMounts: - name: shared-workspace mountPath: /workspace - name: dind-storage mountPath: /var/lib/docker env: - name: DOCKER_TLS_CERTDIR value: "" - name: azure-pipelines-agent image: aws_account_id.dkr.ecr.region.amazonaws.com/webapp:latest env: - name: AZP_URL value: "<Azure account URL>" - name: AZP_POOL value: "eks-agent" - name: AZP_TOKEN valueFrom: secretKeyRef: name: azdevops-pat key: AZP_TOKEN - name: AZP_AGENT_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: DOCKER_HOST value: tcp://localhost:2375 volumeMounts: - mountPath: /workspace name: shared-workspace volumes: - name: dind-storage emptyDir: {} - name: shared-workspace emptyDir: {}

aws_account_id と を AWS アカウント ID と Azure DevOps アカウント URL <Azure account URL>に置き換えます。

AWS DevOps

プライベート Amazon EKS クラスターにエージェントをデプロイします。

Azure Devops エージェントをプライベート Amazon EKS クラスターにデプロイするには、次のコマンドを使用します。

kubectl create -f agent-deployment.tf
AWS DevOps

エージェントが実行されていることを確認します。

Azure DevOps エージェントが実行されていることを確認するには、次のコマンドを使用します。

kubectl get deploy azure-pipelines-agent-eks

予想される出力は次のようになります。

NAME READY UP-TO-DATE AVAILABLE AGE azure-pipelines-agent-eks 1/1 1 1 58s

READY 列に が表示されていることを確認します1/1

AWS DevOps

エージェントが Azure DevOps エージェントプールに登録されていることを確認します。

エージェントがプライベート Amazon EKS クラスターにデプロイされ、エージェントプール に登録されていることを確認するにはeks-agent、次の手順を実行します。

  1. Azure DevOps 組織にサインインします (https://dev.azure.com/{Your_Organization})。

  2. [プロジェクト設定] を選択します。

  3. エージェントプールを選択します。

  4. eks-agent プールを選択し、Agents タブを確認します。

ステータスオンラインのエージェントが 1 つ表示され、エージェントの名前が azure-pipelines-agent-eks-* で始まるはずです。

AWS DevOps
タスク説明必要なスキル

サンプルアプリケーションリポジトリを GitHub アカウントにフォークします。

次の AWS サンプルリポジトリを GitHub アカウントにフォークします。

https://github.com/aws-samples/deploy-kubernetes-resources-to-amazon-eks-using-azure-devops

AWS DevOps

パイプラインを作成する

Azure DevOps アカウントにパイプラインを作成するには、次の手順を実行します。

  1. Azure DevOps 組織で使用する予定のユーザーアカウント () でサインインしますhttps://dev.azure.com/{Your_Organization}

  2. プロジェクトとパイプラインコンソールに移動します。

  3. 新しいパイプラインを選択します。

  4. コードがどこにあるかで、GitHub を選択します。

  5. パイプラインが GitHub アカウントに接続するために必要な認証情報を入力します。

  6. リポジトリ deploy-kubernetes-resources-to-amazon-eks-using-azure-devops を選択します。

  7. パイプラインを設定する で、既存の Azure Pipelines YAML ファイルを選択します。

  8. 既存の YAML ファイルを選択する で、ブランチには mainパスには azure_pipelines.yaml を選択します。

  9. [続行] をクリックしてください。

  10. パイプライン YAML を確認する でawsRegionと の入力パラメータ値を情報に置き換えawsEKSClusterNameます。

pool: name: eks-agent #pool: self-hosted # If you are running self-hosted Azure DevOps Agents stages: # Refering the pipeline template, input parameter that are not specified will be added with defaults - template: ./pipeline_templates/main_template.yaml parameters: serviceConnectionName: aws-sc awsRegion: <your region> awsEKSClusterName: <name of your EKS cluster> projectName: webapp
  1. RUN を選択します。

AWS DevOps

サンプルアプリケーションがデプロイされていることを確認します。

パイプラインが完了したら、Amazon ECR リポジトリと Amazon EKS クラスターの両方をチェックして、サンプルアプリケーションのデプロイが成功したことを確認します。

Amazon ECR リポジトリのアーティファクトを検証するには、次の手順を実行します。

  1. webapp Amazon ECR リポジトリに移動します。

  2. 次の新しいアーティファクトがあることを確認します。

  • Docker イメージ – <date>.<build_number>-image

  • Helm チャート – <date>.<build_number>-helm

例えば、20250501.1-image20250501.1-helm です。

名前空間 のプライベート Amazon EKS クラスターでのデプロイを確認するにはwebapp、次のコマンドを使用します。

kubectl get deploy -n webapp

予想される出力は次のようになります。

NAME READY UP-TO-DATE AVAILABLE webapp 1/1 1 1

注: これが最初のパイプライン実行である場合は、サービス接続とエージェントプールを承認する必要がある場合があります。Azure DevOps パイプラインインターフェイスでアクセス許可リクエストを探し、それらを承認して続行します。

AWS DevOps

トラブルシューティング

問題ソリューション

Amazon ECR リポジトリ名が一致しないとパイプラインが失敗する webapp

サンプルアプリケーションは、Amazon ECR リポジトリ名が の projectName: webappパラメータと一致することを想定していますazure_pipeline.yml

この問題を解決するには、Amazon ECR リポジトリの名前を に変更するかwebapp、以下を更新します。

  • フォークされた GitHub リポジトリのwebappディレクトリの名前を Amazon ECR リポジトリ名と一致するように変更します。

  • Amazon ECR リポジトリ名と一致するazure_pipeline.ymlように の projectNameパラメータを更新します。

エラー: Kubernetes クラスターに到達できません: サーバーがクライアントに認証情報の提供を要求しました

Azure パイプラインの「Pull and Deploy Helm Chart」ステップでこのエラーが発生した場合、根本原因は通常、Amazon EKS クラスターの で誤った IAM ロール設定が原因で発生しますaws-auth ConfigMap

この問題を解決するには、以下を確認してください。

  • aws-auth ConfigMap 設定を確認します。

  • Amazon EKS クラスターの認証設定を確認する: Amazon EKS コンソール、クラスターの詳細アクセス設定を開きます。認証モードEKS API と ConfigMap (EKS API だけでなく) に設定されていることを確認します。

関連リソース

AWS ブログ

AWS のサービス ドキュメント

Microsoft ドキュメント