AWSのサービスを使ってCI/CD環境を構築する手順をなるべく丁寧にまとめてみた

# はじめに

本記事はAWSのサービスを使ってCI/CD環境を構築する際に私が実施した手順をメモしたものである。似たような記事は既にいくつか存在するが、 **この記事を見たらハマることなくCI/CD環境を構築できた！** というものがなく結構苦労したので、個人的な備忘録も兼ねて記事を書くことにした。

## 前提

以下ではAWSのアカウントは既に取得済みであるとして話を進める。

アカウントを取得していない場合は [AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ](https://qiita.com/tmknom/items/303db2d1d928db720888) を参照してIAMユーザーを作成しておくこと。本記事では、上記記事の [管理用のIAMユーザ作成](https://qiita.com/tmknom/items/303db2d1d928db720888#%E7%AE%A1%E7%90%86%E7%94%A8%E3%81%AEiam%E3%83%A6%E3%83%BC%E3%82%B6%E4%BD%9C%E6%88%90) で作成したユーザーを利用している。

## 全体像

本記事で実現したいことの全体像を掲載する。下記イメージは [CodePipeline で CodeCommit/CodeBuild/CodeDeploy を繋げてデリバリプロセスを自動化してみた #reinvent](https://dev.classmethod.jp/cloud/aws/delivery-by-codepipeline-codecommit-codebuild-codedeploy/) から拝借した。

![全体像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/624d90ad-1ca5-595d-d1cc-2201e1cd155c.png)

## IAMユーザーにポリシーをアタッチする

[IAMのページ](https://console.aws.amazon.com/iam/home)を開き、左メニューにある「ユーザー」を選択する。
![IAMユーザーにポリシーを追加する_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/4195f3fa-c1da-2e66-57be-8bb703424642.png)

ポリシーを追加するユーザーを選択する。
![IAMユーザーにポリシーを追加する_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/2b55d11e-8c7f-5798-4a8c-2be4667badf7.png)

IAMユーザーに **AmazonS3FullAccess** と **AWSCodeDeployFullAccess** のポリシーをアタッチする。前者はS3に関する全権限を、後者はCodeDeployに関する全権限をIAMユーザーに付与するポリシーである。
![IAMユーザーにポリシーを追加する_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/043d726d-f000-d7cf-4acc-f6eebb191c48.png)

以上でポリシーのアタッチは終了である。

## CodeCommitにリポジトリを作成する

「サービス」を選択して「codecommit」と入力すると表示される「CodeCommit」をクリックする。
![CodeCommitにリポジトリを作成する_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/bb47efbc-517e-4a82-eb78-f0624440d424.png)

「リポジトリの作成」ボタンを押下する。
![CodeCommitにリポジトリを作成する_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/df6c4cca-2966-5aa0-1bd8-6a2477175acd.png)

「リポジトリ名」に任意の名前（ここでは **CodeDeploySample** とする）を入力して、「作成」ボタンを押下する。
![CodeCommitにリポジトリを作成する_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/7ab254a8-5fa0-10ca-9fc7-e58cae854a79.png)

先ほど作成したリポジトリが表示されれば、CodeCommitにリポジトリを作成する作業は終了である。
![CodeCommitにリポジトリを作成する_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/8fec6b7c-739e-8d52-45a0-5826e726a6d8.png)

## S3バケットを作成する

「サービス」を選択して「s3」と入力すると表示される「S3」をクリックする。
![S3バケットを作成する_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/2b8bf4c7-1c1c-2b45-0516-f03fde2294d6.png)

「バケットを作成する」ボタンを押下する。
![S3バケットを作成する_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/d8ce74bf-bd33-d39b-a748-aa0b484d9e5f.png)

「バケット名」に任意の名前（ここでは **bucket-for-code-deploy** とする）を入力して「次へ」ボタンを押下する。
![S3バケットを作成する_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/88b10886-6d5a-4b60-fa81-6305fe37b28b.png)

「オプションの設定」と「アクセス許可の設定」は全て **デフォルト** の設定を利用する。

以上でS3バケットを作成する作業は終了である。

## CodeBuildにビルドプロジェクトを作成する

「サービス」を選択して「codebuild」と入力すると表示される「CodeBuild」をクリックする。
![CodeBuildにビルドプロジェクトを作成する_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/e60a16e1-a263-7db0-af64-e5911b3225e6.png)

「ビルドプロジェクトを作成する」ボタンを押下する。
![CodeBuildにビルドプロジェクトを作成する_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/0b988596-b187-9885-5b90-bc29076276ca.png)

「プロジェクトの設定」の「プロジェクト名」に任意の名前（ここでは **CodeBuildSample** とする）を入力する。 **追加設定は不要** である。
![CodeBuildにビルドプロジェクトを作成する_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/0a8e3bd9-d9ac-fd33-7e42-ccaafb34f3fd.png)

「送信元」の「ソースプロバイダ」に **AWS CodeCommit** を、「リポジトリ」に先ほど作成したリポジトリ **CodeDeploySample** を設定する。 **追加設定は不要** である。
![CodeBuildにビルドプロジェクトを作成する_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/1de579a1-4f35-a22e-cba7-a749505d7730.png)

「環境」の「オペレーティングシステム」に **Ubuntu** を、「ランタイム」に **Standard** を、「イメージ」に **aws/codebuild/standard:2.0** を、「イメージのバージョン」に **aws/codebuild/standard:2.0-1.10.0** を設定する。その他の項目は **デフォルト** の設定を利用する。
![CodeBuildにビルドプロジェクトを作成する_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/5e7aff98-e096-3e31-53df-4dd999d4cbae.png)

「Buildspec」は全て **デフォルト** の設定を利用する。
![CodeBuildにビルドプロジェクトを作成する_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/e4794a8e-8e1d-912a-573b-56edcca9c1b7.png)

「アーティファクト」の「タイプ」に **Amazon S3** を、「バケット名」に先ほど作成したS3バケット名 **bucket-for-code-deploy** を設定する。その他の項目は **デフォルト** の設定を利用する。
![CodeBuildにビルドプロジェクトを作成する_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/a44337c8-bb0d-ba85-1a99-ac544903f406.png)

「ログ」は全て **デフォルト** の設定を利用する。
![CodeBuildにビルドプロジェクトを作成する_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/2f79471d-d4ec-017f-ced8-02879d63b561.png)

以上の設定が済んだら「ビルドプロジェクトを作成する」ボタンを押下すると、ビルドプロジェクトが作成される。
![CodeBuildにビルドプロジェクトを作成する_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/18e2d38e-ed47-4805-50be-044ee4be4330.png)

以上でビルドプロジェクトを作成する作業は終了である。

## デプロイ先のEC2インスタンスを作成する

「サービス」を選択して「ec2」と入力すると表示される「EC2」をクリックする。
![デプロイ先のEC2インスタンスを作成する_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/b1a9b644-4287-f530-2d01-5a0375111a6b.png)

「インスタンスの作成」ボタンを押下する。
![デプロイ先のEC2インスタンスを作成する_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/1f5ab0b3-57a1-a3ae-7beb-e2011087ca83.png)

一番上にあるAMIを選択する。
![デプロイ先のEC2インスタンスを作成する_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/0d71e254-cccb-f4bc-8d0c-aaa55c1cf85f.png)

インスタンスタイプとして **無料利用枠の対象** となっているものを選択して、「5. タグの追加」をクリックする。
![デプロイ先のEC2インスタンスを作成する_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/8e66ca53-8cbd-26ac-3c99-a30af1839f11.png)

「タグの追加」ボタンを押下する。
![デプロイ先のEC2インスタンスを作成する_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/6060f482-617e-a9f8-6e66-a083a89df978.png)

「キー」と「値」に任意の値（ここでは **deploy** と **code-deploy** とする）を設定して、「6. セキュリティグループの設定」をクリックする。
![デプロイ先のEC2インスタンスを作成する_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/74518ea1-a39c-7792-f3bd-c1a01b5d131d.png)

「ルールの追加」ボタンを押下してタイプ「カスタムTCP」を追加する（ポート範囲を **8080** とする）。追加したら「7. 確認」をクリックする。
![デプロイ先のEC2インスタンスを作成する_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/f6edd9f5-c28f-87f4-dcd5-d1e0ec5c00b4.png)

画面の右下にある「起動」ボタンを押下する。
![デプロイ先のEC2インスタンスを作成する_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/3e2c3b65-98a6-88a1-c188-d20c3e1be9ad.png)

**新しいキーペアの作成** を選択して「キーペア名」に任意の設定（ここでは **code-deploy** とする）を入力して、「キーペアのダウンロード」ボタンを押下する。ダウンロードすると「インスタンスの作成」ボタンが押下できるようになるので、「インスタンスの作成」ボタンを押下する。
![デプロイ先のEC2インスタンスを作成する_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/c70ad8ee-ea05-8c94-61e2-a801a4e5eba2.png)

ダウンロードしたファイル（ **code-deploy.pem** ）を任意のディレクトリ（ここでは ```~/.ssh/``` とする）に移動する。

以上でデプロイ先のEC2インスタンスを作成する作業は終了である。

## CodeDeploy用のロールを作成する

「サービス」を選択して「iam」と入力すると表示される「IAM」をクリックする。
![CodeDeploy用のロールを作成する_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/63d6a2ff-7444-abec-e046-efdc0da4db66.png)

「ロール」を選択して「ロールの作成」ボタンを押下する。
![CodeDeploy用のロールを作成する_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/903303e7-545f-16bd-b66d-7d386a657d94.png)

ロールを使用するサービスとして、画面下にある「CodeDeploy」を選択する。選択すると「ユースケースの選択」が表示されるので「CodeDeploy」を選択して、「次のステップ:アクセス権限」ボタンを押下する。
![CodeDeploy用のロールを作成する_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/c20c651d-cccd-5f53-39b3-d2ef9445a9ca.png)

「次のステップ:タグ」ボタンを押下する。
![CodeDeploy用のロールを作成する_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/eb9927dc-857c-210c-d325-ceb1897fe9a2.png)

「次のステップ:確認」ボタンを押下する。
![CodeDeploy用のロールを作成する_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/df4b1d05-7057-0e8c-f7c0-0ab2a6b4142e.png)

「ロール名」に任意の設定（ここでは **CodeDeployRoleAPI** とする）を入力して、「ロールの作成」ボタンを押下する。
![CodeDeploy用のロールを作成する_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/55498df1-c47e-45a9-da45-b06fe1f596f0.png)

以上でCodeDeploy用のロールを作成する作業は終了である。

## CodeDeployエージェントをEC2インスタンスにインストールする

「サービス」を選択して「ec2」と入力すると表示される「EC2」をクリックする。
![デプロイ先のEC2インスタンスを作成する_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/b1a9b644-4287-f530-2d01-5a0375111a6b.png)

左メニューにある「インスタンス」をクリックする。対象のEC2インスタンスが起動していない場合は「アクション」ボタンを押下して「インスタンスの状態」 → 「開始」を選択して、EC2インスタンスが起動するのを待つ。EC2インスタンスが起動したら「パブリック DNS(IPv4)」の値をコピーする。
![CodeDeployエージェントをEC2インスタンスにインストールする_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/48bf7a87-eaaa-f4b5-d44f-83714e7be433.png)

ターミナルから以下のコマンドを実行してEC2インスタンスにsshログインする。下記コマンドの ```~/.ssh/code-deploy.pem``` は「デプロイ先のEC2インスタンスを作成する」でダウンロードしたファイル名に合わせて修正をする。また ```<your-public-dns>``` には先ほどコピーした値を入力する。

```
$ ssh -i ~/.ssh/code-deploy.pem ec2-user@<your-public-dns>
```

以下のようなアクセス権エラーが出た場合は ```$ chmod 700 ~/.ssh/code-deploy.pem``` として権限を付与する。

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'code-deploy.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "code-deploy.pem": bad permissions
```

sshログインできたら以下のコマンドを実行してCodeDeployエージェントをインストールする。

```
$ sudo yum update
$ sudo yum install ruby
$ cd /home/ec2-user
$ wget https://aws-codedeploy-us-east-1.s3.amazonaws.com/latest/install
$ chmod +x ./install
$ sudo ./install auto
```

以上でCodeDeployエージェントをEC2インスタンスにインストールする作業は終了である。

## EC2インスタンスのロールを作成する

「サービス」を選択して「ec2」と入力すると表示される「EC2」をクリックする。
![デプロイ先のEC2インスタンスを作成する_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/b1a9b644-4287-f530-2d01-5a0375111a6b.png)

左メニューにある「インスタンス」をクリックする。
![EC2インスタンスのロールを作成する_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/2cd5d5bd-8b5c-eb93-ebbc-474e1ac0b8b4.png)

対象のEC2インスタンスを選択して右クリック「インスタンスの設定」 → 「IAMロールの割り当て/置換」を選択する。
![EC2インスタンスのロールを作成する_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/8c0eee30-a9a9-31a0-bd1a-6fe20656d02c.png)

「新しいIAMロールを作成する」をクリックする。
![EC2インスタンスのロールを作成する_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/8e05a7e8-9910-8f00-ceca-28c22ca59126.png)

「ロールの作成」ボタンを押下する。
![EC2インスタンスのロールを作成する_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/38a097b7-863d-8920-9aa7-87785db68f73.png)

「EC2」を選択して「次のステップ:アクセス権限」ボタンを押下する。
![EC2インスタンスのロールを作成する_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/df447e56-6ec5-4eb4-4bd3-b0c050b11f89.png)

「ポリシーの作成」ボタンを押下する。
![EC2インスタンスのロールを作成する_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/7944a620-5bc8-eaea-8593-c8ed58055636.png)

「JSON」タブを選択して下記のJSONを入力後に「ポリシーの確認」ボタンを押下する。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::codedeploy-bucket/*",
                "arn:aws:s3:::aws-codedeploy-us-east-2/*",
                "arn:aws:s3:::aws-codedeploy-us-east-1/*",
                "arn:aws:s3:::aws-codedeploy-us-west-1/*",
                "arn:aws:s3:::aws-codedeploy-us-west-2/*",
                "arn:aws:s3:::aws-codedeploy-ca-central-1/*",
                "arn:aws:s3:::aws-codedeploy-eu-west-1/*",
                "arn:aws:s3:::aws-codedeploy-eu-west-2/*",
                "arn:aws:s3:::aws-codedeploy-eu-west-3/*",
                "arn:aws:s3:::aws-codedeploy-eu-central-1/*",
                "arn:aws:s3:::aws-codedeploy-ap-northeast-1/*",
                "arn:aws:s3:::aws-codedeploy-ap-northeast-2/*",
                "arn:aws:s3:::aws-codedeploy-ap-southeast-1/*",
                "arn:aws:s3:::aws-codedeploy-ap-southeast-2/*",
                "arn:aws:s3:::aws-codedeploy-ap-south-1/*",
                "arn:aws:s3:::aws-codedeploy-sa-east-1/*"
            ]
        }
    ]
}
```

![EC2インスタンスのロールを作成する_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/3a3584ac-afe8-aefc-0f03-54d8fe85f38c.png)

「名前」に任意の名前（ここでは **CodeDeploy-EC2-PermissionsAPI** とする）を入力して、「ポリシーの作成」ボタンを押下する。
![EC2インスタンスのロールを作成する_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/45525c48-377b-6119-3628-e802877b302d.png)

再度「ロールの作成」画面に戻り、先ほど作成したポリシー **CodeDeploy-EC2-PermissionsAPI** にチェックを入れる（「ポリシーのフィルタ」でフィルタリングすると見つけやすい）。続いて **AmazonEC2RoleforAWSCodeDeploy** にもチェックを入れて、「次のステップ:タグ」ボタンを押下する。
![EC2インスタンスのロールを作成する_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/905b0024-c30b-5feb-e99b-65a068774d3d.png)

「次のステップ:確認」ボタンを押下する。
![EC2インスタンスのロールを作成する_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/e755eacf-0193-df30-dcbe-13cdc1166e28.png)

「ロール名」に任意の名前（ここでは **CodeDeploy-EC2-Instance-Profile-API** とする）を入力して、「ロールの作成」ボタンを押下する。
![EC2インスタンスのロールを作成する_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/3d9fbe28-a07f-0071-2732-eda6f43273b9.png)

再度「IAM ロールの割り当て/置換」画面を開き、「IAMロール」に先ほど作成したロールを指定して、「適用」ボタンを押下する。
![EC2インスタンスのロールを作成する_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/92fd3bb4-9dd2-472c-6f36-878318f1949a.png)

EC2インスタンスにsshログインしているターミナルから以下のコマンドを実行して、CodeDeployエージェントを再起動する。再起動する理由は [IAM Roleを後からアタッチしたEC2でAWS CodeDeployに失敗する](https://qiita.com/futa/items/1e2d6f7abbc52f17ad5e) ことを防ぐため。

```
$ sudo service codedeploy-agent restart
```

以上でEC2インスタンスのロールを作成する作業は終了である。

## CodeDeployの設定をする

「サービス」を選択して「codedeploy」と入力すると表示される「CodeDeploy」をクリックする。
![CodeDeployの設定をする_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/6b58fa8f-af4f-3e4d-0a67-74203576c82b.png)

左メニューにある「開始方法」を選択して、「アプリケーションの作成」ボタンを押下する。
![CodeDeployの設定をする_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/8c257960-156e-c65c-d6ea-960ff566dd8e.png)

「アプリケーション名」に任意の名前（ここでは **CodeDeploySample** とする）を、「コンピューティングプラットフォーム」に **EC2/オンプレミス** を設定したら、「アプリケーションの作成」ボタンを押下する。
![CodeDeployの設定をする_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/3f3f515a-527b-6fc1-5a64-474721563957.png)

アプリケーションの作成に成功したら「デプロイグループの作成」ボタンを押下する。
![CodeDeployの設定をする_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/aa66a9a9-0cd9-39ab-aed0-7c378e6187e1.png)

「デプロイグループ名」に任意の名前（ここでは **CodeDeploySampleGroup** とする）を入力する。
![CodeDeployの設定をする_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/695a7730-9371-9325-64ee-bf2fed70022b.png)

「サービスロール」に「CodeDeploy用のロールを作成する」で作成したロール（ **CodeDeployRoleAPI** ）を設定する。
![CodeDeployの設定をする_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/35c7027c-dcd7-a997-0b1b-0a5b9da7697a.png)

**Amazon EC2インスタンス** にチェックを入れて、「タググループ 1」の「キー」と「値」に、「デプロイ先のEC2インスタンスを作成する」で設定した値（ **deploy** と **code-deploy** ）を設定する。
![CodeDeployの設定をする_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/bdc8d8bf-bbef-b6ea-b4b7-8dda5b837338.png)

「デプロイタイプ」は **デフォルト** の設定値を利用する。

「ロードバランサー」は **無効** にする。

以上の設定が終了したら「デプロイグループを作成する」ボタンを押下して、CodeDeployの設定をする作業は終了である。


## CodeCommitの設定をする

[IAMのページ](https://console.aws.amazon.com/iam/home)を開き、左メニューにある「ユーザー」を選択する。
![IAMユーザーにポリシーを追加する_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/4195f3fa-c1da-2e66-57be-8bb703424642.png)

CodeCommitを利用するユーザーを選択する。
![IAMユーザーにポリシーを追加する_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/2b55d11e-8c7f-5798-4a8c-2be4667badf7.png)

「認証情報」タブを開いて、「アクセスキーの作成」ボタンを押下する。このあと必要になるため、 **アクセスキー** と **シークレットアクセスキー** をメモしておく。
![CodeCommitの設定をする_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/36fe692c-768b-3a4a-7229-90cf1802eba4.png)

ターミナルから以下のコマンドを実行して ```awscli``` をインストールする。

```
$ brew install awscli
```

続いて以下のコマンドを実行する。途中でキー情報を聞かれるので、先ほどメモした内容を回答する。リージョンには **ap-northeast-1** を、「デフォルトのアウトプットフォーマット」には **json** を回答する。

```
$ aws configure
```

続いて以下2つのコマンドを実行する。

```
$ git config --global credential.helper '!aws codecommit credential-helper $@'
$ git config --global credential.UseHttpPath true
```

最後に **macユーザーの方のみ**、 [gitのcredential.helperを理解してCodeCommitの403エラーを回避してみた](https://dev.classmethod.jp/tool/git/credential-helper-resolves-codecommit-error/) の「対処法」に記載の内容を実施する。

以上でCodeCommitの設定をする作業は終了である。

## サンプルプロジェクトを用意する

EC2インスタンスにデプロイする用のサンプルプロジェクトを用意する。プロジェクトは各自がデプロイしたいものを使って構わないが、ここでは [GitHub](https://github.com/mizuhara/hello-spring-boot) にある ```Spring Boot``` で作成したHello Worldをサンプルプロジェクトとする。

用意したプロジェクトには、以下2つのファイルが含まれていなくてはならない。配置場所はプロジェクトのルートディレクトリである必要がある。

- buildspec.yml
  - ビルドの設定を記述するファイルである
  - ファイルの中身は必要に応じて修正すること

- appspec.yml
  - デプロイの設定を記述するファイルである
  - ファイルの中身は必要に応じて修正すること

また、本サンプルプロジェクトでは、アプリケーションを起動する際に実行するスクリプト（本サンプルでは何もしない）を ```scripts/start_hello_spring_boot.sh``` に配置してある。こちらも必要に応じて各自用意・修正すること。

用意したサンプルプロジェクトを「CodeCommitにリポジトリを作成する」で作成したリポジトリ（ **CodeDeploySample** ）に ```push``` する。

以上でサンプルプロジェクトを用意する作業は終了である。

## CodePipelineの設定をする

「サービス」を選択して「codepipeline」と入力すると表示される「CodePipeline」をクリックする。
![CodePipelineの設定をする_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/1d31d300-34d5-524d-b62c-c7820cd0b197.png)

左メニューにある「開始方法」を選択して、「パイプラインの作成」ボタンを押下する。
![CodePipelineの設定をする_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/480036cb-9e7c-b5dc-1717-11602a164a9e.png)

「パイプライン名」に任意の名前（ここでは **CodePipelineSample** とする）を入力して、「次に」ボタンを押下する。
![CodePipelineの設定をする_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/89132d56-174c-edb4-335a-e625dc65de5b.png)

「ソースプロバイダー」に **AWS CodeCommit** を、「リポジトリ名」に「CodeCommitにリポジトリを作成する」で作成したリポジトリ名（ **CodeDeploySample** ）を、「ブランチ名」に任意のブランチ名（ここでは **master** とする）を設定する。設定が完了したら「次に」ボタンを押下する。
![CodePipelineの設定をする_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/3a421f4a-286b-c0bb-3247-6102223caab9.png)

「プロバイダーを構築する」に **AWS CodeBuild** を、「リージョン」に **アジアパシフィック（東京）** を、「プロジェクト名」に「CodeBuildにビルドプロジェクトを作成する」で作成したプロジェクト名（ **CodeBuildSample** ）を設定する。設定が完了したら「次に」ボタンを押下する。
![CodePipelineの設定をする_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/8e3822e4-84cf-da69-01f1-57156023756f.png)

「デプロイプロバイダー」に **AWS CodeCommit** を、「リージョン」に **アジアパシフィック（東京）** を、「アプリケーション名」と「デプロイグループ」には「CodeDeployの設定をする」で設定した値（ **CodeDeploySample** と **CodeDeploySampleGroup** ）をそれぞれ設定する。設定が完了したら「次に」ボタンを押下する。
![CodePipelineの設定をする_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/28856/dbbf20f4-3ad7-ef3c-76f9-9dc09e75125a.png)

「パイプラインを作成する」ボタンを押下すると、ビルド・デプロイが実行される。

全て成功すればCI/CD環境の構築は完了である。もしエラーが出た場合はEC2インスタンスにログインをして、ログファイル ```/var/log/aws/codedeploy-agent/codedeploy-agent.log``` の情報をもとにエラーを解決する。

## 参考URL

- [BitbucketでAWS CodeDeployを利用した自動デプロイ](https://qiita.com/kamihork/items/240463bf65c344fabf07)

- [AWS CodeDeployを触ってみる (EC2)](https://qiita.com/namoshika/items/7fe953dbb0b5e25b913b)

- [AWSのCodeCommit使い方。アクセスキー作るところからなど。](https://qiita.com/sachiko-kame/items/dff732276dffd22e7682)