チュートリアル: Amazon EKS にアプリケーションをデプロイする - Amazon CodeCatalyst

チュートリアル: Amazon EKS にアプリケーションをデプロイする

このチュートリアルでは、Amazon CodeCatalyst ワークフロー、Amazon Elastic Kubernetes Service をはじめとするいくつかの AWS のサービスを使用して、コンテナ化されたアプリケーションを Amazon EKS にデプロイする方法について説明します。デプロイされたアプリケーションはシンプルな「Hello, World!」です。Apache ウェブサーバー Docker イメージ上にビルドされたウェブサイト。このチュートリアルでは、開発マシンや Amazon EKS クラスターのセットアップなど必要な準備作業を説明し、アプリケーションをビルドしてクラスターにデプロイするワークフローの作成方法を説明します。

最初のデプロイが完了すると、チュートリアルでアプリケーションソースを変更するように指示されます。この変更により、新しい Docker イメージがビルドされ、新しいリビジョン情報を使用して Docker イメージリポジトリにプッシュされます。その後、Docker イメージの新しいリビジョンが Amazon EKS にデプロイされます。

ヒント

このチュートリアルを進める代わりに、完全な Amazon EKS セットアップを実行するブループリントを使用できます。[EKS App Deployment] ブループリントを使用する必要があります。詳細については、「ブループリントを使用したプロジェクトの作成」を参照してください。

前提条件

このチュートリアルを開始する前に:

  • 接続された AWS アカウントを持つ Amazon CodeCatalyst スペースが必要です。詳細については、「スペースを作成する」を参照してください。

  • スペースには、次の名前の空のプロジェクトが必要です。

    codecatalyst-eks-project

    このプロジェクトを作成するには、[ゼロから開始] オプションを使用します。

    詳細については、「Amazon CodeCatalyst での空のプロジェクトの作成」を参照してください。

  • プロジェクトには、次の名前の空白の CodeCatalyst [ソースリポジトリ] が必要です。

    codecatalyst-eks-source-repository

    詳細については、「CodeCatalyst のソースリポジトリでコードを保存し、共同作業を行う」を参照してください。

  • プロジェクトには、CodeCatalyst CI/CD 環境 (開発環境ではない) が必要です。

    codecatalyst-eks-environment

    この環境を次のように設定します。

    • [非本番稼働用] など、任意のタイプを選択します。

    • AWS アカウントに接続します。

    • [デフォルトの IAM ロール] で、任意のロールを選択します。後で別のロールを指定します。

    詳細については、「AWS アカウント と VPC へのデプロイ」を参照してください。

ステップ 1: 開発マシンをセットアップする

このチュートリアルの最初のステップは、このチュートリアル全体で使用するいくつかのツールを使用して開発マシンを設定することです。これらのロールは次のとおりです。

  • eksctl ユーティリティ – クラスター作成用

  • kubectl ユーティリティ – eksctl の前提条件

  • AWS CLI - eksctl の前提条件でもあります。

これらのツールは、既存の開発マシンにインストールすることも、クラウドベースの CodeCatalyst 開発環境を使用することもできます。CodeCatalyst 開発環境の利点は、スピンアップとテイクダウンが簡単で、他の CodeCatalyst サービスと統合されているため、このチュートリアルをより少ないステップで実行できます。

このチュートリアルでは、CodeCatalyst 開発環境を使用することを前提としています。

次の手順では、CodeCatalyst 開発環境を起動し、必要なツールを使用して設定する簡単な方法について説明しますが、詳細な手順が必要な場合は、次を参照してください。

新しい開発環境を起動するには
  1. https://codecatalyst.aws/ で CodeCatalyst コンソールを開きます。

  2. プロジェクト「codecatalyst-eks-project」に移動します。

  3. ナビゲーションペインで [コード] を選択してから、[ソースリポジトリ] を選択します。

  4. ソースリポジトリの名前「codecatalyst-eks-source-repository」を選択します。

  5. 上部近くで [開発環境を作成] を選択し、[AWS Cloud9 (ブラウザで)] を選択します。

  6. [既存のブランチで作業][メイン] が選択されていることを確認してから、[作成] を選択します。

    開発環境が新しいブラウザタブで起動し、リポジトリ (codecatalyst-eks-source-repository) がそこにクローンされます。

kubectl をインストールして設定するには
  1. 開発環境ターミナルで、次のように入力します。

    curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.18.9/2020-11-02/bin/linux/amd64/kubectl
  2. 次のように入力します。

    chmod +x ./kubectl
  3. 次のように入力します。

    mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/bin
  4. 次のように入力します。

    echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc
  5. 次のように入力します。

    kubectl version --short --client
  6. バージョンが表示されることを確認します。

    kubectl がインストールされました。

eksctl をインストールして設定するには
注記

kubectl を代わりに使用できるため、eksctl は必須ではありません。ただし、eksctl にはクラスター設定の多くを自動化する利点があるため、このチュートリアルで推奨されるツールです。

  1. 開発環境ターミナルで、次のように入力します。

    curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
  2. 次のように入力します。

    sudo cp /tmp/eksctl /usr/bin
  3. 次のように入力します。

    eksctl version
  4. バージョンが表示されることを確認します。

    eksctl がインストールされました。

AWS CLI がインストールされていることを確認するには
  1. 開発環境ターミナルで、次のように入力します。

    aws --version
  2. バージョンが表示され、AWS CLI がインストールされていることを確認します。

    残りの手順を完了して、AWS にアクセスするために必要なアクセス許可を持つ AWS CLI を設定します。

AWS CLI を設定するには

AWS サービスへのアクセスを許可するには、 アクセスキーとセッショントークンを使用して AWS CLI を設定する必要があります。以下の手順では、キーとトークンを簡単に設定できますが、詳細な手順が必要な場合は、「AWS Command Line Interface ユーザーガイド」の「AWS CLI の設定」を参照してください。

  1. IAM アイデンティティセンターユーザーを次のように作成します。

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

      (IAM アイデンティティセンターにサインインしたことがない場合は、[有効化] を選択する必要があります。)

      注記

      CodeCatalyst スペースに接続されている AWS アカウント を使用してサインインしてください。スペースに移動し、[AWS アカウント] タブを選択することで、接続されているアカウントを確認できます。詳細については、「スペースを作成する」を参照してください。

    2. ナビゲーションペインで [Users] (ユーザー)、[Add user] (ユーザーの追加) の順に選択します。

    3. [ユーザー名] に次のように入力します。

      codecatalyst-eks-user
    4. [パスワード] で、[このユーザーと共有できるワンタイムパスワードを生成] を選択します。

    5. [E メールアドレス][E メールアドレスを確認] で、IAM アイデンティティセンターにまだ存在しない E メールアドレスを入力します。

    6. [名(ローマ字)] に次のように入力します。

      codecatalyst-eks-user
    7. [姓(ローマ字)] に次のように入力します。

      codecatalyst-eks-user
    8. [表示名] では、以下を維持します。

      codecatalyst-eks-user codecatalyst-eks-user
    9. [Next] を選択します。

    10. [グループにユーザーを追加] ページで、[次へ] を選択します。

    11. ユーザーを確認と追加」ページで情報を確認し、[ユーザーを追加] を選択します。

      [ワンタイムパスワード] ダイアログボックスが表示されます。

    12. [コピー] を選択し、サインイン情報をテキストファイルに貼り付けます。サインイン情報は、AWS アクセスポータル URL、ユーザー名、ワンタイムパスワードで構成されます。

    13. [閉じる] を選択します。

  2. 次のようにアクセス権限セットを作成します。

    1. ナビゲーションペインで [アクセス許可セット] を選択し、[アクセス許可セットの作成] を選択します。

    2. [事前定義されたアクセス許可セットのポリシー][AdministratorAccess] を選択します。このポリシーではすべての AWS のサービス アクションに対するアクセス許可が与えられています。

    3. [Next] を選択します。

    4. [アクセス許可セット名] で、AdministratorAccess を削除して次のように入力します。

      codecatalyst-eks-permission-set
    5. [Next] を選択します。

    6. [確認と作成] ページで情報を確認し、[グループの作成] を選択します。

  3. アクセス許可セットを次のように codecatalyst-eks-user に設定します。

    1. ナビゲーションペインで AWS アカウント を選択し、現在サインインしている AWS アカウント の横にあるチェックボックスをオンにします。

    2. [ユーザーまたはグループの割り当て] を選択します。

    3. [ユーザー] タブを選択します。

    4. [codecatalyst-eks-user] のチェックボックスをオンにします。

    5. [Next] を選択します。

    6. [codecatalyst-eks-permission-set] のチェックボックスをオンにします。

    7. [Next] を選択します。

    8. 情報を確認し、[送信] を選択します。

      これで、codecatalyst-eks-usercodecatalyst-eks-permission-set をバインドして、AWS アカウント に割り当てました。

  4. 次のように、 codecatalyst-eks-user のアクセスキーとセッショントークンを取得します。

    1. AWS アクセスポータル URL と、codecatalyst-eks-user のユーザー名とワンタイムパスワードがあることを確認します。この情報は、事前にテキストエディタにコピーしておく必要があります。

      注記

      この情報がない場合は、IAM アイデンティティセンターの codecatalyst-eks-user 詳細ページに移動し、[パスワードをリセット][ワンタイムパスワードを生成 [...]] を選択して、もう一度 [パスワードをリセットする] と、画面に情報が表示されます。

    2. AWS からサインアウトします。

    3. AWS アクセスポータル URL をブラウザのアドレスバーに貼り付けます。

    4. 次の情報でサインインします。

      • ユーザー名:

        codecatalyst-eks-user
      • パスワード:

        one-time-password

    5. [新しいパスワードを設定] で、新しいパスワードを入力し、[新しいパスワードを設定] を選択します。

      画面に AWS アカウント ボックスが表示されます。

    6. AWS アカウント を選択し、AWS アカウント ユーザーとアクセス許可セットを割り当てた codecatalyst-eks-user の名前を選択します。

    7. codecatalyst-eks-permission-set の隣にある [コマンドラインまたはプログラムによるアクセス] を選択します。

    8. ページの中央にあるコマンドをコピーします。次のような内容です。

      export AWS_ACCESS_KEY_ID="AKIAIOSFODNN7EXAMPLE" export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" export AWS_SESSION_TOKEN="session-token"

      ...[session-token] は長いランダムな文字列です。

  5. アクセスキーとセッショントークンを次のように AWS CLI に追加します。

    1. CodeCatalyst 開発環境に戻ります。

    2. ターミナルプロンプトで、コピーしたコマンドを貼り付けます。[Enter] キーを押します。

      これで、アクセスキーとセッショントークンを使用して AWS CLI を設定しました。AWS CLI を使用して、このチュートリアルに必要なタスクを完了できるようになりました。

      重要

      このチュートリアル中に次のようなメッセージが表示される場合:

      Unable to locate credentials. You can configure credentials by running "aws configure".

      または:

      ExpiredToken: The security token included in the request is expired

      AWS CLI セッションの有効期限が切れたのが理由です。この場合、aws configure コマンドは実行しないでください。代わりに、Obtain codecatalyst-eks-user's access key and session token で始まるこの手順のステップ 4 の手順を使用して、セッションを更新します。

ステップ 2: Amazon EKS クラスターを作成する

このセクションでは、Amazon EKS にクラスターを作成します。以下の手順では、eksctl を使用してクラスターを素早く作成する方法について説明しますが、詳細な手順が必要な場合は、次を参照してください。

注記

[プライベートクラスター] は、Amazon EKS との CodeCatalyst 統合ではサポートされていません。

開始する前に

開発マシンで次のタスクを完了していることを確認します。

  • eksctl ユーティリティをインストールする。

  • kubectl ユーティリティをインストールする。

  • AWS CLI をインストールし、アクセスキーとセッショントークンを使用して設定しました。

これらのタスクを完了する方法の詳細については、「ステップ 1: 開発マシンをセットアップする」を参照してください。

クラスターを作成するには
重要

クラスターが正しく設定されないため、Amazon EKS サービスのユーザーインターフェイスを使用してクラスターを作成しないでください。以下のステップで説明されているように、 eksctl ユーティリティを使用します。

  1. 開発環境に移動します。

  2. クラスターおよびノードを作成する

    eksctl create cluster --name codecatalyst-eks-cluster --region us-west-2

    コードの説明は以下のとおりです。

    • [codecatalyst-eks-cluster] は、クラスターに付ける名前に置き換えられます。

    • [us-west-2] を、ご利用のリージョンに置き換えます。

    10~20 分後、次のようなメッセージが表示されます。

    EKS cluster "codecatalyst-eks-cluster" in "us-west-2" region is ready

    注記

    AWS がクラスターを作成中に複数の waiting for CloudFormation stack メッセージが表示されます。これは通常の動作です。

  3. クラスターが正常に作成されたことを確認します。

    kubectl cluster-info

    クラスターが正常に作成されたことを示す次のようなメッセージが表示されます。

    Kubernetes master is running at https://long-string.gr7.us-west-2.eks.amazonaws.com CoreDNS is running at https://long-string.gr7.us-west-2.eks.amazonaws.com/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

ステップ 3: Amazon ECR イメージリポジトリを作成する

このセクションでは、Amazon Elastic Container Registry (Amazon ECR) にプライベートイメージリポジトリを作成します。このリポジトリには、チュートリアル用の Docker イメージが保存されます。

Amazon ECR の詳細については、Amazon Elastic Container Registry User Guide を参照してください。

Amazon ECR にイメージリポジトリを作成するには
  1. 開発環境に移動します。

  2. Amazon ECR に空白のリポジトリを作成します。

    aws ecr create-repository --repository-name codecatalyst-eks-image-repo

    [codecatalyst-eks-image-repo] を Amazon ECR リポジトリに付ける名前に置き換えます。

    このチュートリアルでは、リポジトリ に「codecatalyst-eks-image-repo」と名前を付けていることを前提としています。

  3. Amazon ECR リポジトリの詳細を表示します。

    aws ecr describe-repositories \ --repository-names codecatalyst-eks-image-repo
  4. “repositoryUri”: の値、例えば「111122223333.dkr.ecr.us-west-2.amazonaws.com/codecatalyst-eks-image-repo」を書き留めます。

    ワークフローにリポジトリを追加するときは、後にこれが必要となります。

ステップ 4: ソースファイルを追加する

このセクションでは、ソースリポジトリ (codecatalyst-eks-source-repository) にアプリケーションソースファイルを追加します。これらは以下で構成されます。

  • index.html ファイル – 「Hello, World!」を表示します。ブラウザのメッセージ。

  • Dockerfile – Docker イメージに使用するベースイメージと、それに適用する Docker コマンドについて説明します。

  • deployment.yaml ファイル – Kubernetes サービスとデプロイを定義する Kubernetes マニフェスト。

フォルダは次のような構造になっています。

|— codecatalyst-eks-source-repository |— Kubernetes |— deployment.yaml |— public-html | |— index.html |— Dockerfile

index.html

index.html ファイルには「Hello, World!」と表示されます。ブラウザのメッセージ。

index.html ファイルを追加するには
  1. 開発環境に移動します。

  2. codecatalyst-eks-source-repository に「public-html」という名前のフォルダを作成します。

  3. /public-html に「index.html」という名前のファイルを次の内容で作成します。

    <html> <head> <title>Hello World</title> <style> body { background-color: black; text-align: center; color: white; font-family: Arial, Helvetica, sans-serif; } </style> </head> <body> <h1>Hello, World!</h1> </body> </html>
  4. ターミナルプロンプトで、次のように入力します。

    cd /projects/codecatalyst-eks-source-repository
  5. 追加、コミット、プッシュ:

    git add . git commit -m "add public-html/index.html" git push

    index.html は、public-html フォルダ内のリポジトリに追加されます。

Dockerfile

Dockerfile は、使用するベース Docker イメージと、それに適用する Docker コマンドについて説明します。Dockerfile の詳細については、「Dockerfile リファレンス」を参照してください。

ここで指定された Dockerfile は、Apache 2.4 ベースイメージ (httpd) を使用することを示します。また、ウェブページを提供する Apache サーバーのフォルダに「index.html」というソースファイルをコピーする手順も含まれています。Dockerfile の EXPOSE 命令は、コンテナがポート 80 でリッスンしていることを Docker に伝えます。

Dockerfile を追加するには
  1. codecatalyst-eks-source-repository に「Dockerfile」という名前のファイルを次の内容で作成します。

    FROM httpd:2.4 COPY ./public-html/index.html /usr/local/apache2/htdocs/index.html EXPOSE 80

    ファイル名に拡張子は含めないでください。

    重要

    Dockerfile はリポジトリのルートフォルダに存在する必要があります。ワークフローの Docker build コマンドは、ワークフローが存在することを期待します。

  2. 追加、コミット、プッシュ:

    git add . git commit -m "add Dockerfile" git push

    Dockerfile がリポジトリに追加されます。

deployment.yaml

このセクションでは、リポジトリに deployment.yaml ファイルを追加します。deployment.yaml ファイルは、Kubernetes マニフェストであり、実行する 2 つの Kubernetes リソースタイプまたは種類、つまり「サービス」と「デプロイ」を定義します。

  • 「サービス」はロードバランサーを Amazon EC2 にデプロイします。ロードバランサーには、「Hello, World!」を参照するために使用できるインターネット向けパブリック URL と標準ポート (ポート 80) が用意されています。アプリケーションをデプロイします。

  • 「デプロイ」は 3 つのポッドをデプロイし、各ポッドには「Hello, World!」を含む Docker コンテナが含まれます。アプリケーションをデプロイします。3 つのポッドは、クラスターの作成時に作成されたノードにデプロイされます。

このチュートリアルのマニフェストは短いですが、マニフェストにはポッド、ジョブ、ingress、ネットワークポリシーなど、任意の数の Kubernetes リソースタイプを含めることができます。さらに、デプロイが複雑な場合は、複数のマニフェストファイルを使用できます。

deployment.yaml ファイルを追加するには
  1. codecatalyst-eks-source-repository に、「Kubernetes」という名前のフォルダを作成します。

  2. /Kubernetes に「deployment.yaml」という名前のファイルを次の内容で作成します。

    apiVersion: v1 kind: Service metadata: name: my-service labels: app: my-app spec: type: LoadBalancer selector: app: my-app ports: - protocol: TCP port: 80 targetPort: 80 --- apiVersion: apps/v1 kind: Deployment metadata: name: my-deployment labels: app: my-app spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: codecatalyst-eks-container # The $REPOSITORY_URI and $IMAGE_TAG placeholders will be replaced by actual values supplied by the build action in your workflow image: $REPOSITORY_URI:$IMAGE_TAG ports: - containerPort: 80
  3. 追加、コミット、プッシュ:

    git add . git commit -m "add Kubernetes/deployment.yaml" git push

    deployment.yaml ファイルは、Kubernetes というフォルダのリポジトリに追加されます。

これで、すべてのソースファイルが追加されました。

少し時間を取って作業を再確認し、すべてのファイルを正しいフォルダに配置してください。フォルダは次のような構造になっています。

|— codecatalyst-eks-source-repository |— Kubernetes |— deployment.yaml |— public-html | |— index.html |— Dockerfile

ステップ 5: AWS ロールを作成する

このセクションでは、CodeCatalyst ワークフローが機能するために必要な AWS IAM ロールを作成します。これらのロールは次のとおりです。

  • ビルドロール – CodeCatalyst ビルドアクション (ワークフロー内) に、AWS アカウントにアクセスして Amazon ECR と Amazon EC2 に書き込むアクセス許可を付与します。

  • ロールをデプロイ – AWS アカウントと Amazon EKS にアクセスするための CodeCatalyst [Kubernetes にデプロイ] アクション (ワークフロー内) アクセス許可を付与します。

IAM ロールの詳細については、「AWS Identity and Access Management ユーザーガイド」の「IAM ロール」を参照してください。

注記

時間を節約するため、前に一覧表示した 2 つのロールではなく、CodeCatalystWorkflowDevelopmentRole-spaceName ロールと呼ばれる 1 つのロールを作成できます。詳細については、「アカウントとスペース用の CodeCatalystWorkflowDevelopmentRole-spaceName ロールを作成する」を参照してください。CodeCatalystWorkflowDevelopmentRole-spaceName ロールには、セキュリティリスクをもたらす可能性のある非常に広範なアクセス許可があることを理解します。このロールは、セキュリティが懸念されないチュートリアルやシナリオでのみ使用することをお勧めします。このチュートリアルでは、前述の 2 つのロールを作成することを前提としています。

ビルドロールとデプロイロールを作成するには、以下の一連の手順を実行します。

1. 両方のロールの信頼ポリシーを作成するには
  1. 開発環境に移動します。

  2. 次の内容で、Cloud9-long-string ディレクトリに「codecatalyst-eks-trust-policy.json」という名前のファイルを作成します。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": [ "codecatalyst-runner.amazonaws.com", "codecatalyst.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
2. ビルドロールのビルドポリシーを作成するには
  • 次の内容で、Cloud9-long-string ディレクトリに「codecatalyst-eks-build-policy.json」という名前のファイルを作成します。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ecr:*", "ec2:*" ], "Resource": "*" } ] }
    注記

    ロールがワークフローアクションの実行に初めて使用されるときは、リソースポリシーステートメントでワイルドカードを使用し、利用可能になった後にリソース名でポリシーの範囲を絞り込みます。

    "Resource": "*"
3. デプロイロールにデプロイポリシーを作成するには
  • 次の内容で、Cloud9-long-string ディレクトリに「codecatalyst-eks-deploy-policy.json」という名前のファイルを作成します。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "eks:DescribeCluster", "eks:ListClusters" ], "Resource": "*" } ] }
    注記

    ロールがワークフローアクションの実行に初めて使用されるときは、リソースポリシーステートメントでワイルドカードを使用し、利用可能になった後にリソース名でポリシーの範囲を絞り込みます。

    "Resource": "*"

これで、開発環境に 3 つのポリシードキュメントが追加されました。ディレクトリ構造は次のようになります。

|— Cloud9-long-string |— .c9 |— codecatalyst-eks-source-repository |— Kubernetes |— public-html |— Dockerfile codecatalyst-eks-build-policy.json codecatalyst-eks-deploy-policy.json codecatalyst-eks-trust-policy.json
4. ビルドポリシーを AWS に追加するには
  1. 開発環境ターミナルで、次のように入力します。

    cd /projects
  2. 次のように入力します。

    aws iam create-policy \ --policy-name codecatalyst-eks-build-policy \ --policy-document file://codecatalyst-eks-build-policy.json
  3. [Enter] キーを押します。

  4. コマンド出力で、例えば「arn:aws:iam::111122223333:policy/codecatalyst-eks-build-policy」などの "arn": 値を書き留めます。この ARN は後で必要になります。

5. デプロイポリシーを AWS に追加するには
  1. 次のように入力します。

    aws iam create-policy \ --policy-name codecatalyst-eks-deploy-policy \ --policy-document file://codecatalyst-eks-deploy-policy.json
  2. [Enter] キーを押します。

  3. コマンド出力で、例えば「arn:aws:iam::111122223333:policy/codecatalyst-eks-deploy-policy」などのデプロイポリシーの "arn": 値を書き留めます。この ARN は後で必要になります。

6. ビルドロールを作成するには
  1. 次のように入力します。

    aws iam create-role \ --role-name codecatalyst-eks-build-role \ --assume-role-policy-document file://codecatalyst-eks-trust-policy.json
  2. [Enter] キーを押します。

  3. 次のように入力します。

    aws iam attach-role-policy \ --role-name codecatalyst-eks-build-role \ --policy-arn arn:aws:iam::111122223333:policy/codecatalyst-eks-build-policy

    [arn:aws:iam::111122223333:policy/codecatalyst-eks-build-policy] が、先ほど説明したビルドポリシーの ARN に置き換えられます。

  4. [Enter] キーを押します。

  5. ターミナルプロンプトで、次のように入力します。

    aws iam get-role \ --role-name codecatalyst-eks-build-role
  6. [Enter] キーを押します。

  7. ロールの "Arn": の値、例えば「arn:aws:iam::111122223333:role/codecatalyst-eks-build-role」を書き留めます。この ARN は後で必要になります。

7. デプロイロールを作成するには
  1. 次のように入力します。

    aws iam create-role \ --role-name codecatalyst-eks-deploy-role \ --assume-role-policy-document file://codecatalyst-eks-trust-policy.json
  2. [Enter] キーを押します。

  3. 次のように入力します。

    aws iam attach-role-policy \ --role-name codecatalyst-eks-deploy-role \ --policy-arn arn:aws:iam::111122223333:policy/codecatalyst-eks-deploy-policy

    [arn:aws:iam::111122223333:policy/codecatalyst-eks-deploy-policy] が、先ほど説明したデプロイポリシーの ARN に置き換えられます。

  4. [Enter] キーを押します。

  5. 次のように入力します。

    aws iam get-role \ --role-name codecatalyst-eks-deploy-role
  6. [Enter] キーを押します。

  7. ロールの "Arn": の値、例えば「arn:aws:iam::111122223333:role/codecatalyst-eks-deploy-role」を書き留めます。この ARN は後で必要になります。

これで、ビルドとデプロイのロールが作成され、その ARN が記録されました。

ステップ 6: CodeCatalyst に AWS ロールを追加する

このステップでは、ビルドロール (codecatalyst-eks-build-role) を追加し、スペースに接続した AWS アカウント にビルドロール (codecatalyst-eks-deploy-role) をデプロイします。これにより、ロールをワークフローで使用できるようになります。

ビルドロールとデプロイロールを AWS アカウント に追加するには
  1. CodeCatalyst コンソールで、スペースに移動します。

  2. 上部にある [設定] をクリックします。

  3. ナビゲーションペインで、[AWS アカウント] を選択します。アカウントの一覧が表示されます。

  4. [Amazon CodeCatalyst の表示名] 列で、ビルドロールとデプロイロールを作成した AWS アカウント の表示名をコピーします。(数値である可能性があります。) この値は、ワークフローを作成するときに後で必要になります。

  5. 表示名を選択します。

  6. [AWS 管理コンソールからロールの管理] を選択します。

    [Amazon CodeCatalyst スペースに IAM ロールの追加] ページが表示されます。ページにアクセスするには、サインインが必要な場合があります。

  7. [IAM で作成した既存のロールを追加] を選択します。

    ドロップダウンリストが表示されます。この一覧表示には、ビルドロールとデプロイロール、および codecatalyst-runner.amazonaws.com.rproxy.goskope.comcodecatalyst.amazonaws.com サービスプリンシパルを含む信頼ポリシーを持つ他の IAM ロールが表示されます。

  8. ドロップダウンリストから追加します。

    • codecatalyst-eks-build-role

    • codecatalyst-eks-deploy-role

    注記

    The security token included in the request is invalid が表示された場合は、適切なアクセス許可がない可能性があります。この問題を修正するには、CodeCatalyst スペースの作成時に使用した AWS アカウントで AWS からサインアウトしてサインインし直します。

  9. CodeCatalyst コンソールに戻り、ページを更新します。

    ビルドロールとデプロイロールが [IAM ロール] の下に表示されるようになりました。

    これらのロールが CodeCatalyst ワークフローで使用できるようになりました。

ステップ 7: ConfigMap を更新する

[Kubernetes クラスターにデプロイ] アクション (ワークフロー内) にクラスターにアクセスして操作できるようにするには、ステップ 5: AWS ロールを作成する で作成したデプロイロールを Kubernetes ConfigMap ファイルに追加する必要があります。このタスクは、eksctl または kubectl を使用できます。

eksctl を使用して Kubernetes ConfigMap ファイルを設定するには
  • 開発環境ターミナルで、次のように入力します。

    eksctl create iamidentitymapping --cluster codecatalyst-eks-cluster --arn arn:aws:iam::111122223333:role/codecatalyst-eks-deploy-role --group system:masters --username codecatalyst-eks-deploy-role --region us-west-2

    コードの説明は以下のとおりです。

    • codecatalyst-eks-cluster は、Amazon EKS クラスターのクラスター名に置き換えられます。

    • [arn:aws:iam::111122223333:role/codecatalyst-eks-deploy-role] は、ステップ 5: AWS ロールを作成する で作成したデプロイロールの ARN に置き換えられます。

    • [codecatalyst-eks-deploy-role] (--username の隣) は、ステップ 5: AWS ロールを作成する で作成したデプロイロールの名前に置き換えられます。

      注記

      デプロイロールを作成しない場合は、[codecatalyst-eks-deploy-role]CodeCatalystWorkflowDevelopmentRole-spaceName ロールの名前に置き換えます。このロールの詳細については、「ステップ 5: AWS ロールを作成する」を参照してください。

    • [us-west-2] を、ご利用のリージョンに置き換えます。

    このコマンドの詳細については、[IAM ユーザーとロールの管理] を参照してください。

    次のようなメッセージが表示されます。

    2023-06-09 00:58:29 [ℹ]  checking arn arn:aws:iam::111122223333:role/codecatalyst-eks-deploy-role against entries in the auth ConfigMap
    2023-06-09 00:58:29 [ℹ]  adding identity "arn:aws:iam::111122223333:role/codecatalyst-eks-deploy-role" to auth ConfigMap
kubectl を使用して Kubernetes ConfigMap ファイルを設定するには
  1. 開発環境ターミナルで、次のように入力します。

    kubectl edit configmap -n kube-system aws-auth

    ConfigMap ファイルが画面に表示されます。

  2. 赤い斜体でテキストを追加します。

    # Please edit the object below. Lines beginning with a '#' will be ignored,
    # and an empty file will abort the edit. If an error occurs while saving this file will be
    # reopened with the relevant failures.
    #
    apiVersion: v1
    data:
      mapRoles: |
        - groups:
          - system:bootstrappers
          - system:nodes
          rolearn: arn:aws:iam::111122223333:role/eksctl-codecatalyst-eks-cluster-n-NodeInstanceRole-16BC456ME6YR5
          username: system:node:{{EC2PrivateDNSName}}
        - groups:
          - system:masters
          rolearn: arn:aws:iam::111122223333:role/codecatalyst-eks-deploy-role
          username: codecatalyst-eks-deploy-role
      mapUsers: |
        []
    kind: ConfigMap
    metadata:
      creationTimestamp: "2023-06-08T19:04:39Z"
      managedFields:
      ...

    コードの説明は以下のとおりです。

    • [arn:aws:iam::111122223333:role/codecatalyst-eks-deploy-role] は、ステップ 5: AWS ロールを作成する で作成したデプロイロールの ARN に置き換えられます。

    • [codecatalyst-eks-deploy-role] (username: の隣) は、ステップ 5: AWS ロールを作成する で作成したデプロイロールの名前に置き換えられます。

      注記

      デプロイロールを作成しない場合は、[codecatalyst-eks-deploy-role]CodeCatalystWorkflowDevelopmentRole-spaceName ロールの名前に置き換えます。このロールの詳細については、「ステップ 5: AWS ロールを作成する」を参照してください。

    詳細については、「Amazon EKS ユーザーガイド」の「クラスターへの IAM プリンシパルアクセスを有効化」を参照してください。

これで、デプロイロールが付与され、さらには Kubernetes クラスターに [Amazon EKS にデプロイ] アクション、 system:masters アクセス許可が付与されました。

ステップ 8: ワークフローを作成して実行する

このステップでは、ソースファイルを受け取り、Docker イメージにビルドし、Amazon EKS クラスターのツリーポッドにイメージをデプロイするワークフローを作成します。

ワークフローは、連続して実行される次の構成要素で構成されます。

  • トリガー – このトリガーは、ソースリポジトリに変更をプッシュすると、ワークフローを自動的に開始します。トリガーについての詳細は、「トリガーを使用したワークフロー実行の自動的な開始」を参照してください。

  • ビルドアクション (BuildBackend) – トリガー時に、アクションは Dockerfile を使用して Docker イメージをビルドし、そのイメージを Amazon ECR にプッシュします。ビルドアクションは、deployment.yaml ファイル内の $REPOSITORY_URI および $IMAGE_TAG 変数を正しい値で更新し、このファイルと Kubernetes フォルダ内の他のすべての出力アーティファクトを作成します。このチュートリアルでは、Kubernetes フォルダ内の唯一のファイルは deployment.yaml ですが、さらにファイルを含めることができます。このアーティファクトは、次のデプロイアクションの入力として使用されます。

    ビルドアクションの詳細については、「ワークフローを使用したビルド」を参照してください。

  • デプロイアクション (DeployToEKS) – ビルドアクションが完了すると、デプロイアクションはビルドアクション (Manifests) によって生成された出力アーティファクトを検索し、その内部の deployment.yaml ファイルを見つけます。次に、アクションは deployment.yaml ファイルの指示に従って 3 つのポッドを実行します。それぞれに 1 つの「Hello, World!」が含まれます。Docker コンテナ — Amazon EKS クラスター内。

ワークフローを作成するには
  1. CodeCatalyst コンソールを移動します。

  2. プロジェクト (codecatalyst-eks-project) に移動します。

  3. ナビゲーションペインで [CI/CD][ワークフロー] の順に選択します。

  4. [ワークフローを作成] を選択します。

  5. [ソースリポジトリ] で、codecatalyst-eks-source-repository を選択します。

  6. [ブランチ] で、main を選択します。

  7. [Create] (作成) を選択します。

  8. YAML サンプルコードを削除します。

  9. 次の YAML コードを追加して、新しいワークフロー定義ファイルを作成します。

    注記

    ワークフロー定義ファイルの詳細については、「ワークフロー YAML 定義」を参照してください。

    注記

    次の YAML コードでは、必要に応じて Connections: セクションを省略できます。このセクションを省略する場合は、環境の [デフォルト IAM ロール] フィールドで指定されたロールに、ステップ 6: CodeCatalyst に AWS ロールを追加する で記述されている両方のロールのアクセス許可と信頼ポリシーが含まれていることを確認する必要があります。デフォルトの IAM ロールを使用して環境を設定する方法の詳細については、「環境を作成する」を参照してください。

    Name: codecatalyst-eks-workflow SchemaVersion: 1.0 Triggers: - Type: PUSH Branches: - main Actions: BuildBackend: Identifier: aws/build@v1 Environment: Name: codecatalyst-eks-environment Connections: - Name: codecatalyst-account-connection Role: codecatalyst-eks-build-role Inputs: Sources: - WorkflowSource Variables: - Name: REPOSITORY_URI Value: 111122223333.dkr.ecr.us-west-2.amazonaws.com/codecatalyst-eks-image-repo - Name: IMAGE_TAG Value: ${WorkflowSource.CommitId} Configuration: Steps: #pre_build: - Run: echo Logging in to Amazon ECR... - Run: aws --version - Run: aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-west-2.amazonaws.com #build: - Run: echo Build started on `date` - Run: echo Building the Docker image... - Run: docker build -t $REPOSITORY_URI:latest . - Run: docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG #post_build: - Run: echo Build completed on `date` - Run: echo Pushing the Docker images... - Run: docker push $REPOSITORY_URI:latest - Run: docker push $REPOSITORY_URI:$IMAGE_TAG # Replace the variables in deployment.yaml - Run: find Kubernetes/ -type f | xargs sed -i "s|\$REPOSITORY_URI|$REPOSITORY_URI|g" - Run: find Kubernetes/ -type f | xargs sed -i "s|\$IMAGE_TAG|$IMAGE_TAG|g" - Run: cat Kubernetes/* # The output artifact will be a zip file that contains Kubernetes manifest files. Outputs: Artifacts: - Name: Manifests Files: - "Kubernetes/*" DeployToEKS: DependsOn: - BuildBackend Identifier: aws/kubernetes-deploy@v1 Environment: Name: codecatalyst-eks-environment Connections: - Name: codecatalyst-account-connection Role: codecatalyst-eks-deploy-role Inputs: Artifacts: - Manifests Configuration: Namespace: default Region: us-west-2 Cluster: codecatalyst-eks-cluster Manifests: Kubernetes/

    上記のコードで置き換えます。

    • 前提条件 で作成された環境名を持つ [codecatalyst-eks-environment] の両方のインスタンス。

    • アカウント接続の表示名を持つ [codecatalyst-account-connection] の両方のインスタンス。表示名は数値である場合があります。詳細については、「ステップ 6: CodeCatalyst に AWS ロールを追加する」を参照してください。

    • ステップ 5: AWS ロールを作成する で作成したビルドロールの名前を持つ [codecatalyst-eks-build-role]

    • ステップ 3: Amazon ECR イメージリポジトリを作成する で作成された Amazon ECR リポジトリの URI を持つ [111122223333.dkr.ecr.us-west-2.amazonaws.com/codecatalyst-eks-image-repo] (Value: プロパティ内)。

    • [111122223333.dkr.ecr.us-west-2.amazonaws.com] (Run: aws ecr コマンド内) と、イメージサフィックス (/codecatalyst-eks-image-repo) のない Amazon ECR リポジトリの URI。

    • ステップ 5: AWS ロールを作成する で作成したデプロイロールの名前を持つ [codecatalyst-eks-deploy-role]

    • AWS リージョンコードを持つ [us-west-2] の両方のインスタンス。リージョンコードの一覧については、「AWS 全般のリファレンス」の「Regional endpoints」を参照してください。

    注記

    ビルドロールとデプロイロールを作成しない場合は、[codecatalyst-eks-build-role][codecatalyst-eks-deploy-role]CodeCatalystWorkflowDevelopmentRole-spaceName ロールの名前に置き換えます。このロールの詳細については、「ステップ 5: AWS ロールを作成する」を参照してください。

  10. (オプション) [検証] を選択して、コミットする前に YAML コードが有効であることを確認します。

  11. [Commit] (コミット) を選択します。

  12. [コミットワークフロー] ダイアログボックスで、次のように入力します。

    1. [コミットメッセージ] の場合、テキストを削除して次のように入力します。

      Add first workflow
    2. [レポジトリ]codecatalyst-eks-source-repository を選択します。

    3. [ブランチ名] で、main を選択します。

    4. [Commit] (コミット) を選択します。

    これでワークフローが作成されました。ワークフローの先頭で定義されているトリガーにより、ワークフローの実行が自動的に開始されます。具体的には、workflow.yaml ファイルをソースリポジトリにコミット (およびプッシュ) すると、トリガーによってワークフローの実行が開始します。

ワークフロー実行の進行状況を表示するには
  1. CodeCatalyst コンソールのナビゲーションペインで、[CI/CD] を選択し、[ワークフロー] を選択します。

  2. 先ほど作成したワークフロー「codecatalyst-eks-workflow」を選択します。

  3. [BuildBackend] を選択すると、ビルドの進行状況が表示されます。

  4. [DeployToEKS] を選択してデプロイの進行状況を確認します。

    実行の詳細を表示する方法については、「ワークフロー実行のステータスと詳細の表示」を参照してください。

デプロイを確認するには
  1. Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/) を開きます。

  2. 左側の下部近くにある [ロードバランサー] を選択します。

  3. Kubernetes デプロイの一部として作成されたロードバランサーを選択します。どのロードバランサーを選択するかわからない場合は、[タグ] タブで次のタグを探します。

    • kubernetes.io/service-name

    • kubernetes.io/cluster/ekstutorialcluster

  4. 正しいロードバランサーを選択し、[説明] タブを選択します。

  5. [DNS 名] の値をコピーしてブラウザのアドレスバーに貼り付けます。

    「Hello World!」 ウェブページがブラウザに表示され、アプリケーションが正常にデプロイされたことを示します。

ステップ 9: ソースファイルを変更する

このセクションでは、ソースリポジトリ内の index.html ファイルを変更します。この変更により、ワークフローは新しい Docker イメージをビルドし、コミット ID でタグ付けして Amazon ECR にプッシュし、Amazon ECS にデプロイします。

index.html を変更するには
  1. 開発環境に移動します。

  2. ターミナルプロンプトで、ソースリポジトリに変更します。

    cd /projects/codecatalyst-eks-source-repository
  3. 最新のワークフロー変更をプルします。

    git pull
  4. codecatalyst-eks-source-repository/public-html/index.html を開きます。

  5. 行 14 で、Hello, World! テキストを Tutorial complete! に変更します。

  6. 追加、コミット、プッシュ:

    git add . git commit -m "update index.html title" git push

    ワークフローの実行が自動的に開始します。

  7. (オプション) 以下を入力します。

    git show HEAD

    index.html 変更のコミット ID を書き留めます。このコミット ID は、先ほど開始したワークフロー実行によってデプロイされる Docker イメージにタグ付けされます。

  8. デプロイの進行状況を確認します。

    1. CodeCatalyst コンソールのナビゲーションペインで [CI/CD][ワークフロー] の順に選択します。

    2. codecatalyst-eks-workflow を選択して最新の実行を表示します。

    3. [BuildBackend] および [DeployToEKS] を選択して、ワークフローの実行の進行状況を確認します。

  9. 次のように、アプリケーションが更新されていることを確認します。

    1. Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/) を開きます。

    2. 左側の下部近くにある [ロードバランサー] を選択します。

    3. Kubernetes デプロイの一部として作成されたロードバランサーを選択します。

    4. [DNS 名] の値をコピーしてブラウザのアドレスバーに貼り付けます。

      これでチュートリアルは完了です。ウェブページがブラウザに表示され、新バージョンのアプリケーションが正常にデプロイされたことを示します。

  10. (オプション) AWS で、Amazon ECR コンソールに切り替え、新しい Docker イメージにこの手続きのステップ 7 のコミット ID がタグ付けされていることを確認します。

クリーンアップ

このチュートリアルで使用されるストレージリソースとコンピューティングリソースに対して不必要に課金されないように、環境をクリーンアップする必要があります。

次をクリーンアップするには:
  1. クラスターを削除する

    1. 開発環境ターミナルで、次のように入力します。

      eksctl delete cluster --region=us-west-2 --name=codecatalyst-eks-cluster

      コードの説明は以下のとおりです。

      • [us-west-2] を、ご利用のリージョンに置き換えます。

      • [codecatalyst-eks-cluster] は、作成したクラスターの名前に置き換えられます。

      5~10 分後、AWS CloudFormation スタック、ノードグループ (Amazon EC2)、ロードバランサーなど、関連するリソースとクラスターが削除されます。

    重要

    eksctl delete cluster コマンドが機能しない場合は、AWS 認証情報または kubectl 認証情報を更新する必要がある場合があります。更新する認証情報がわからない場合は、まず AWS 認証情報を更新します。AWS 認証情報を更新するには、「「認証情報が見つかりません」および「ExpiredToken」というエラーを解決するにはどうすればよいですか?」を参照してください。kubectl 認証情報を更新するには、「「サーバーに接続できません」というエラーを解決するにはどうすればよいですか?」を参照してください。

  2. AWS コンソールで、次のようにクリーンアップします。

    1. Amazon ECR で、codecatalyst-eks-image-repo を削除します。

    2. IAM アイデンティティセンターで削除します。

      1. codecatalyst-eks-user

      2. codecatalyst-eks-permission-set

    3. IAM で、次を削除します。

      • codecatalyst-eks-build-role

      • codecatalyst-eks-deploy-role

      • codecatalyst-eks-build-policy

      • codecatalyst-eks-deploy-policy

  3. CodeCatalyst コンソールで、次のようにクリーンアップします。

    1. codecatalyst-eks-workflow を削除します。

    2. codecatalyst-eks-environment を削除します。

    3. codecatalyst-eks-source-repository を削除します。

    4. 開発環境を削除します。

    5. codecatalyst-eks-project を削除します。

このチュートリアルでは、CodeCatalyst ワークフローと Amazon EKS へのデプロイアクションを使用してアプリケーションを [Kubernetes にデプロイ] する方法について説明します。