

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

# チュートリアル: CodePipeline を使用して Amazon EKS にデプロイする
<a name="tutorials-eks-deploy"></a>

このチュートリアルは、Amazon EKS で設定したクラスターにコードをデプロイするデプロイアクションを CodePipeline で作成する方法について説明します。

EKS アクションは、パブリック EKS クラスターとプライベート EKS クラスターの両方をサポートします。プライベートクラスターは EKS で推奨されるタイプですが、どちらのタイプもサポートされています。

**注記**  
コンソールでのパイプライン作成の一環として、CodePipeline は S3 アーティファクトバケットをアーティファクトとして使用します (これは S3 ソースアクションで使用するバケットとは異なります)。S3 アーティファクトバケットがパイプラインのアカウントとは異なるアカウントにある場合は、S3 アーティファクトバケットが によって所有 AWS アカウント されており、安全で信頼できることを確認してください。

**注記**  
このアクションでは、CodePipeline マネージド CodeBuild コンピューティングを使用して、ビルド環境でコマンドを実行します。コマンドアクションを実行すると、 AWS CodeBuildで別途料金が発生します。

**注記**  
`EKS` デプロイアクションは V2 タイプのパイプラインでのみ使用できます。

## 前提条件
<a name="tutorials-eks-deploy-prereqs"></a>

このチュートリアルで CD パイプラインを作成する前に、いつくかのリソースを用意する必要があります。使用を開始するために必要なものは以下のとおりです。

**注記**  
これらのリソースはすべて、同じ AWS リージョン内に作成する必要があります。
+ サンプル `deployment.yaml` ファイルを追加するソースコントロールリポジトリ (このチュートリアルでは GitHub を使用します）。
+ 以下の [ステップ 3: IAM の CodePipeline サービスロールポリシーを更新する](#tutorials-eks-deploy-role) を使用してこのアクションのアクセス許可で更新された、既存の CodePipeline サービスロールを使用する必要があります。必要なアクセス許可は、作成するクラスターのタイプに基づきます。詳細については、「[サービスロールのポリシーのアクセス許可](action-reference-EKS.md#action-reference-EKS-service-role)」を参照してください。
+ ECR またはイメージリポジトリにプッシュした作業イメージとリポジトリタグ。

これらの前提条件を満たした後、チュートリアルに進んで CD パイプラインを作成できます。

## ステップ 1: (オプション) Amazon EKS でクラスターを作成する
<a name="tutorials-eks-deploy-cluster"></a>

パブリックエンドポイントまたはプライベートエンドポイントを使用して EKS クラスターを作成できます。

次の手順では、EKS でパブリッククラスターまたはプライベートクラスターを作成します。クラスターをすでに作成している場合、このステップはオプションです。

### Amazon EKS にクラスターを作成する
<a name="tutorials-eks-deploy-cluster-public"></a>

このステップでは、EKS にクラスターを作成します。

**パブリッククラスターを作成する**

1. EKS コンソールを開いて **[クラスターの作成]** を選択します。

1. **[名前]** で、クラスターに名前を付けます。[**次へ**] を選択します。

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

### Amazon EKS でプライベートクラスターを作成する
<a name="tutorials-eks-deploy-cluster-private"></a>

プライベートエンドポイントを使用してクラスターを作成する場合は、プライベートサブネットのみをアタッチし、それらにインターネット接続があることを確認してください。

プライベートエンドポイントを使用してクラスターを作成するには、次の 5 つのサブステップに従います。

**コンソールで VPC を作成します。**

1. VPC コンソールを開いて **[VPC の作成]** を選択します。

1. **[VPC 設定]** で、**[VPC など]** を選択します。

1. 1 つのパブリックサブネットと 4 つのプライベートサブネットを作成することを選択します。**[Create VPC（VPC の作成）]** を選択します。

1. サブネットページで、**[プライベート]** を選択します。

**VPC 内のプライベートサブネットを確認する**

1. VPC に移動し、VPC ID を選択して VPC の詳細ページを開きます。

1. VPC の詳細ページで、**[リソースマップ]** タブを選択します。

1. 図を確認して、プライベートサブネットを書き留めます。サブネットにはパブリックまたはプライベートのステータスを示すラベルが表示され、各サブネットはルートテーブルにマッピングされます。  
![\[\]](http://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/images/eks-deploy-subnets.png)

   プライベートクラスターにはすべてのプライベートサブネットがあることに注意してください。

1. NAT ゲートウェイをホストするパブリックサブネットを作成します。一度に VPC にアタッチできるインターネットゲートウェイは 1 つだけです。

**パブリックサブネット内に NAT ゲートウェイを作成する**

1. パブリックサブネットで、NAT ゲートウェイを作成します。VPC コンソールに移動し、**[インターネットゲートウェイ]**を選択します。[**インターネットゲートウェイの作成**] を選択します。

1. [名前] にインターネットゲートウェイの名前を入力します。[**インターネットゲートウェイの作成**] を選択します。

プライベートサブネットのルートテーブルを更新して、トラフィックを NAT ゲートウェイに転送します。

**プライベートサブネットのルートテーブルに NAT ゲートウェイを追加する**

1. VPC コンソールに移動し、**[サブネット]** を選択します。

1. 各プライベートサブネットで選択して、詳細ページでそのサブネットのルートテーブルを選択し、**[ルートテーブルの編集]** を選択します。

1. プライベートサブネットのルートテーブルを更新して、インターネットトラフィックを NAT ゲートウェイに転送します。**[Add Rule]** (ルートの追加) を選択します。追加するオプションから **[NAT ゲートウェイ]** を選択します。作成したインターネットゲートウェイを選択します。

1. パブリックサブネットのカスタムルートテーブルを作成します。パブリックサブネットのネットワークアクセスコントロールリスト (ACL) で、プライベートサブネットからのインバウンドトラフィックが許可されていることを確認します。

1. **[Save changes]** (変更の保存) をクリックします。

このステップでは、EKS にクラスターを作成します。

**プライベートクラスターを作成する**

1. EKS コンソールを開いて **[クラスターの作成]** を選択します。

1. **[名前]** で、クラスターに名前を付けます。[**次へ**] を選択します。

1. VPC およびその他の設定情報を指定します。**[作成]** を選択します。

EKS クラスターは、パブリッククラスターでもプライベートクラスターでもかまいません。このステップは、プライベートエンドポイントのみを持つクラスター用です。クラスターがプライベートであることを確認してください。

## ステップ 2: Amazon EKS でプライベートクラスターを設定する
<a name="tutorials-eks-deploy-cluster-private-configure"></a>

このステップは、プライベートクラスターを作成している場合にのみ適用されます。このステップは、プライベートエンドポイントのみを持つクラスター用です。

**クラスターを設定する**

1. **[ネットワーク]** タブの EKS クラスターにのみプライベートサブネットをアタッチします。[ステップ 1: (オプション) Amazon EKS でクラスターを作成する](#tutorials-eks-deploy-cluster) の「**VPC 内のプライベートサブネットを確認する**」セクションでキャプチャされたプライベートサブネットをアタッチします。

1. CodePipeline はパイプラインの S3 アーティファクトバケットからアーティファクトを保存および取得するため、プライベートサブネットがインターネットにアクセスできることを確認します。

## ステップ 3: IAM の CodePipeline サービスロールポリシーを更新する
<a name="tutorials-eks-deploy-role"></a>

このステップでは、`cp-service-role` などの既存の CodePipeline サービスロールを CodePipeline がクラスターに接続するために必要なアクセス許可で更新します。既存のロールがない場合は、新しいロールを作成します。

CodePipeline サービスロールを次の手順で更新します。

**CodePipeline サービスロールポリシーを更新するには**

1. [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) で IAM コンソール を開きます。

1. コンソールダッシュボードで [**ロール**] を選択します。

1. `cp-service-role` などの CodePipeline サービスロールを検索します。

1. 新しいインラインポリシーを追加します。

1. **[ポリシーエディター]** に、次のポリシーを入力します。
   + パブリッククラスターの場合は、次のアクセス許可を追加します。

------
#### [ JSON ]

****  

     ```
     {
         "Version":"2012-10-17",		 	 	 
     
         "Statement": [
             {
                 "Sid": "EksClusterPolicy",
                 "Effect": "Allow",
                 "Action": "eks:DescribeCluster",
                 "Resource": "arn:aws:eks:us-east-1:111122223333:cluster/my-cluster"
             },
             {
                 "Sid": "EksVpcClusterPolicy",
                 "Effect": "Allow",
                 "Action": [
                     "ec2:DescribeDhcpOptions",
                     "ec2:DescribeNetworkInterfaces",
                     "ec2:DescribeRouteTables",
                     "ec2:DescribeSubnets",
                     "ec2:DescribeSecurityGroups",
                     "ec2:DescribeVpcs"
                 ],
                 "Resource": [
                     "*"
                 ]
             }
         ]
     }
     ```

------
   + プライベートクラスターの場合は、次のアクセス許可を追加します。プライベートクラスターには、該当する場合、VPC に対する追加のアクセス許可が必要です。

------
#### [ JSON ]

****  

     ```
     {
         "Version":"2012-10-17",		 	 	 
     
         "Statement": [
             {
                 "Sid": "EksClusterPolicy",
                 "Effect": "Allow",
                 "Action": "eks:DescribeCluster",
                 "Resource": "arn:aws:eks:us-east-1:111122223333:cluster/my-cluster"
             },
             {
                 "Sid": "EksVpcClusterPolicy",
                 "Effect": "Allow",
                 "Action": [
                     "ec2:DescribeDhcpOptions",
                     "ec2:DescribeNetworkInterfaces",
                     "ec2:DescribeRouteTables",
                     "ec2:DescribeSubnets",
                     "ec2:DescribeSecurityGroups",
                     "ec2:DescribeVpcs"
                 ],
                 "Resource": [
                     "*"
                 ]
             },
             {
                 "Effect": "Allow",
                 "Action": "ec2:CreateNetworkInterface",
                 "Resource": "*",
                 "Condition": {
                     "StringEqualsIfExists": {
                         "ec2:Subnet": [
                             "arn:aws:ec2:us-east-1:ACCOUNT-ID:subnet/subnet-03ebd65daeEXAMPLE",
                             "arn:aws:ec2:us-east-1:ACCOUNT-ID:subnet/subnet-0e377f6036EXAMPLE",
                             "arn:aws:ec2:us-east-1:ACCOUNT-ID:subnet/subnet-0db658ba1cEXAMPLE",
                             "arn:aws:ec2:us-east-1:ACCOUNT-ID:subnet/subnet-0db658ba1cEXAMPLE"
                         ]
                     }
                 }
             },
             {
                 "Effect": "Allow",
                 "Action": "ec2:CreateNetworkInterfacePermission",
                 "Resource": "*",
                 "Condition": {
                     "ArnEquals": {
                         "ec2:Subnet": [
                             "arn:aws:ec2:us-east-1:111122223333:subnet/subnet-03ebd65daeEXAMPLE",
                             "arn:aws:ec2:us-east-1:111122223333:subnet/subnet-0e377f6036EXAMPLE",
                             "arn:aws:ec2:us-east-1:111122223333:subnet/subnet-0db658ba1cEXAMPLE",
                             "arn:aws:ec2:us-east-1:111122223333:subnet/subnet-0db658ba1cEXAMPLE"
                         ]
                     }
                 }
             },
             {
                 "Effect": "Allow",
                 "Action": "ec2:DeleteNetworkInterface",
                 "Resource": "*",
                 "Condition": {
                     "StringEqualsIfExists": {
                         "ec2:Subnet": [
                             "arn:aws:ec2:us-east-1:ACCOUNT-ID:subnet/subnet-03ebd65daeEXAMPLE",
                             "arn:aws:ec2:us-east-1:ACCOUNT-ID:subnet/subnet-0e377f6036EXAMPLE",
                             "arn:aws:ec2:us-east-1:ACCOUNT-ID:subnet/subnet-0db658ba1cEXAMPLE",
                             "arn:aws:ec2:us-east-1:ACCOUNT-ID:subnet/subnet-0db658ba1cEXAMPLE"
                         ]
                     }
                 }
             }
         ]
     }
     ```

------

1. [**ポリシーの更新**] を選択してください。

## ステップ 4: CodePipeline サービスロールのアクセスエントリを作成する
<a name="tutorials-eks-deploy-access-entry"></a>

このステップでは、ステップ 3 で更新した CodePipeline サービスロールとマネージドアクセスポリシーを追加するアクセスエントリをクラスターに作成します。

1. EKS コンソールを開いてクラスターに移動します。

1. **[リモートアクセス]** タブを選択してください。

1. **[IAM アクセスエントリ]** で、**[アクセスエントリの作成]** を選択します。

1. **[IAM プリンシパル ARN]** で、`cp-service-role` などのアクション用に更新したロールを入力します。[**次へ**] を選択します。

1. **[ステップ 2: アクセスポリシーの追加]** ページの **[ポリシー名]** で、`AmazonEKSClusterAdminPolicy` などのアクセス用のマネージドポリシーを選択します。[**Add policy**] を選択します。[**次へ**] を選択します。
**注記**  
これは、CodePipeline アクションが Kubernetes と通信するために使用するポリシーです。ベストプラクティスとして、マネージドポリシーではなく最小特権でポリシーのアクセス許可を絞り込むには、代わりにカスタムポリシーをアタッチします。

1. 確認ページで、**[作成]** を選択します。

## ステップ 5: ソースリポジトリを作成し、`helm chart` 設定ファイルを追加する
<a name="tutorials-eks-deploy-source"></a>

このステップでは、アクションに適した設定ファイル (Kubernetes マニフェストファイルまたは Helm チャート) を作成し、その設定ファイルをソースリポジトリに保存します。設定に適したファイルを使用します。詳細については、[https://kubernetes.io/docs/reference/kubectl/quick-reference/](https://kubernetes.io/docs/reference/kubectl/quick-reference/) または [https://helm.sh/docs/topics/charts/](https://helm.sh/docs/topics/charts/) を参照してください。
+ Kubernetes の場合は、マニフェストファイルを使用します。
+ Helm の場合は、Helm チャートを使用します。

1. GitHub リポジトリを作成するか、既存のものを使用します。

1. 以下の例に示すように、Helm チャートファイルのリポジトリに新しい構造を作成します。

   ```
   mychart
   |-- Chart.yaml
   |-- charts
   |-- templates
   |   |-- NOTES.txt
   |   |-- _helpers.tpl
   |   |-- deployment.yaml
   |   |-- ingress.yaml
   |   `-- service.yaml
   `-- values.yaml
   ```

1. ファイルをリポジトリのルートレベルに追加します。

## ステップ 6: パイプラインを作成する
<a name="tutorials-eks-deploy-pipeline"></a>

CodePipeline ウィザードを使用してパイプラインステージを作成し、ソースリポジトリを接続します。

**パイプラインを作成するには**

1. CodePipeline コンソール ([https://console.aws.amazon.com/codepipeline/](https://console.aws.amazon.com/codepipeline/)) を開きます。

1. [**ようこそ**] ページ、[**開始方法**] ページ、または [**パイプライン**] ページで、[**パイプラインの作成**] を選択します。

1. **[ステップ 1: 作成オプションを選択する]** ページの **[作成オプション]** で、**[カスタムパイプラインを構築する]** オプションを選択します。**[次へ]** を選択します。

1. **[ステップ 2: パイプラインの設定を選択する]** で、**[パイプライン名]** に「**MyEKSPipeline**」と入力します。

1. CodePipeline は、特徴と料金が異なる V1 タイプと V2 タイプのパイプラインを提供しています。V2 タイプは、コンソールで選択できる唯一のタイプです。詳細については、「[パイプラインタイプ](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipeline-types-planning.html?icmpid=docs_acp_help_panel)」を参照してください。CodePipeline の料金については、[料金](https://aws.amazon.com/codepipeline/pricing/)を参照してください。

1. **[サービスロール]** で、ステップ 3 で更新したサービスロールを選択します。

1. [**詳細設定**] をデフォルト設定のままにし、[**次へ**] を選択します。

1. **[ステップ 3: ソースステージの追加]** ページの **[ソースプロバイダー]** で、**[GitHub リポジトリへの接続を作成すること]** を選択します。

1. **[ステップ 4: ビルドステージの追加]** ページで、**[スキップ]** を選択します。

1. **[ステップ 5: デプロイステージの追加]** ページで、**[Amazon EKS]** を選択します。  
![\[Deploy configuration form with Helm selected, showing fields for release name and chart location.\]](http://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/images/eks-action-example.png)

   1. **[デプロイ設定タイプ]** で、**[Helm]** を選択します。

   1. **[Helm チャートの場所]** で、`my-release` などのリリース名を入力します。**[Helm チャートの場所]** で、`mychart` などの Helm チャートファイルのパスを入力します。

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

1. [**Step 6: Review**] ページで、パイプラインの設定を確認し、[**Create pipeline**] を選択してパイプラインを作成します。  
![\[\]](http://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/images/eks-deploy-pipeline.png)

1. パイプラインが正常に実行されたら、**[詳細を表示]** を選択してアクションのログを表示し、アクション出力を表示します。