AWS Code シリーズ

#■AWSのCode シリーズ#

**CodeCommit**
ソースコードを管理するGitリポジトリサービス

**CodeBuild**
ソースコードのビルド/テスティングサービス

**CodeDeploy**
ビルドされたモジュールのデプロイサービス

**CodePipeline**
継続的デリバリー/継続的インテグレーションをサポートするサービス

![スクリーンショット 2019-03-26 0.04.02.png](https://qiita-image-store.s3.amazonaws.com/0/280929/d28a875d-6e6e-23eb-09a4-feb036b43695.png)


#1.CodeCommit#

**概要**
- 簡単にGitリポジトリをホストすることができる。
- サードバーティ製のツールも利用可能。
- [プルリクエスト](https://backlog.com/ja/git-tutorial/pull-request/pull-request1_1.html)機能も利用可能。

**接続方法**
- [コンソール](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/getting-started-cc.html)
- [https](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/getting-started.html)
- ssh

**基本的な利用の流れ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/fb4e97e0-77fc-f391-739f-84e1d1ff9333.png)

**その他参考情報**

https://qiita.com/jqtype/items/9196e047eddb53d07a91

##1-1 CodeCommitのリポジトリを作成する##

[リポジトリ名]に任意のものを入力
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/48130022-4a88-4a33-d9d5-296073ab372e.png)

##1-2 初期セットアップ、コードのPush##

IAMユーザの権限を使って、CodeCommitのリポジトリに接続し、Pushします。

gitを利用するのに最初に実行。

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

誰が登録したかわかるようにユーザー情報を入れる。

```
git config --global user.name "[user_name]"
git config --global user.email "[user_email]"
```

gitでこのディレクトリを管理すると定義する。

```
git init

##.gitができあがっていることも確認しておく。
ll -a
drwxrwxr-x 7 ec2-user ec2-user 4096  3月 26 00:47 .git
```

先程作成したリポジトリをリモートとして登録する。

```
git remote add origin [https_clone_url]

git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	buildspec.yml
	src/

nothing added to commit but untracked files present (use "git add" to track)
```

全てを追加する。

```
git add -A

git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

	new file:   buildspec.yml
	new file:   src/appspec.yml
	new file:   src/img/img1.jpeg
	new file:   src/img/img2.jpeg
	new file:   src/index.php
	new file:   src/script/clean.sh
```

コミットする。

```
git commit -m "first commit"
[master (root-commit) e9e67f0] first commit
 6 files changed, 69 insertions(+)
 create mode 100644 buildspec.yml
 create mode 100644 src/appspec.yml
 create mode 100644 src/img/img1.jpeg
 create mode 100644 src/img/img2.jpeg
 create mode 100644 src/index.php
 create mode 100644 src/script/clean.sh
```

pushする。

```
git push origin master
[ec2-user@demo-batch work]$ git push origin master
Counting objects: 11, done.
Compressing objects: 100% (9/9), done.
Writing objects: 100% (11/11), 516.43 KiB | 18.44 MiB/s, done.
Total 11 (delta 0), reused 0 (delta 0)
To https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/demo-codcommit
 * [new branch]      master -> master
```

コンソールからpushされたことも確認する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/db7472ea-720b-bfc4-d545-2d5e1dd1b337.png)


#2.CodeBuild#

**概要**

- ビルドサービス
- ソースコードのコンパイルを行ったり、テストを実行する環境を簡単に構築することができる。
- CodeBuild上で行う作業については、buildspec.ymlに定義する。

**流れ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/b3ddeae8-e94c-5db5-4d98-77aa08f9bf49.png)


##2-1 成果物格納用のS3バケットを準備しておく##

S3バケットを作成し、[バージョニング](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/user-guide/enable-versioning.html) を有効にしておく。
![スクリーンショット 2019-03-26 19.01.56.png](https://qiita-image-store.s3.amazonaws.com/0/280929/7a93bdc8-85f1-fecf-ebd2-8aba039ce7c7.png)

バージョニングについては実際に試されている↓の記事が参考になりました。
[今さらだけどS3のバージョニングを試してみた。](https://qiita.com/kooohei/items/8775b380632e8b7940a3)

##2-2 buildspec.ymlを作成する##

```yml:buildspec.yml

##[application-name] は後で必要になるので適当な名前に、
##[S3-bucket-name]は「2-1 成果物格納用のS3バケットを準備しておく」で作成したS3バケットを指定。

version: 0.1

phases:
  build:
    commands:
      - aws deploy push --region ap-northeast-1 --application-name [application-name] --s3-location s3://[S3-bucket-name]/sample.zip --source src
artifacts:
  files:
    - '**/*'
  base-directory: src
  name: sample.zip
```

##2-3 CodeBuildプロジェクトを作成する##

[Project name] は任意の名前を入力
![スクリーンショット 2019-03-26 19.19.44.png](https://qiita-image-store.s3.amazonaws.com/0/280929/b60f0877-790e-311d-bcb3-4fcc7867b720.png)

[Source provider][リポジトリ] は「1.AWSCodeCommit」のリポジトリから取ってくるように指定します。
![スクリーンショット 2019-03-26 19.22.29.png](https://qiita-image-store.s3.amazonaws.com/0/280929/6aa8a49c-9147-6875-d6b1-c3ee882ec516.png)

[Operating system]は Ubuntu しか選べません。
*Amazon Linux2も選べるようになりましたね。*
[Runtime]は PHP にしておきます。
![スクリーンショット 2019-03-26 19.28.25.png](https://qiita-image-store.s3.amazonaws.com/0/280929/ce0edd68-7345-9b42-8986-3b8cc469a950.png)

[Service role]は New service role で新しく作成する。※後でポリシーを追加します。
![スクリーンショット 2019-03-26 19.35.33.png](https://qiita-image-store.s3.amazonaws.com/0/280929/b753ecde-1e9a-8764-58c4-1ed575fdb8d7.png)

[Type]は AmazonS3
[Bucket name]に作成したS3バケットを指定
[Enable semantic versioning]にチェック
[Namespace type]はBuild IDを指定
![スクリーンショット 2019-03-26 19.34.14.png](https://qiita-image-store.s3.amazonaws.com/0/280929/01c75639-e54e-08d0-69f0-85b874e94d5e.png)
![スクリーンショット 2019-03-26 19.34.31.png](https://qiita-image-store.s3.amazonaws.com/0/280929/ac5c86a1-9a64-1982-55e1-75392a88e92a.png)


##2-4 Service roleにIMAポリシーを追加する##

先ほど作成した、Service roleに以下2つのポリシーを追加してください。

`AWSCodeDeployDeployerAccess
AmazonS3FullAccess`
![スクリーンショット 2019-03-26 20.24.52.png](https://qiita-image-store.s3.amazonaws.com/0/280929/fc7ab87b-17ee-7ecb-4b9b-98751c0caeb9.png)


#3.CodeDeploy#

- デプロイ自動化サービス
- appspec.ymlにデプロイ時の動作を定義する
- デプロイ方式を1台、半分、全台など選択可能。
- デプロイ先にエージェントをインストールする必要がある。

**AppSpec の「hooks」**
Hooksでライフサイクルイベントを設定してデプロイ時に任意のスクリプトを実行できます。 
また、スクリプトの実行ポイントは複数あり、細かく制御可能です。 
フックスクリプトはアプリケーションのアーカイブ（zip）にバンドルし、S3やCodeCommitにアップロードします。 
通常、アプリケーションにhooksディレクトリやScripsディレクトリを作成し、実行権を付与したスクリプトファイルを配置します。 

[AppSpec の「hooks」セクション](https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/reference-appspec-file-structure-hooks.html)
[CodeDeployのApplicationStopイベントフックはどう実行される?](https://dev.classmethod.jp/cloud/aws/codedeploy-applicationstop-hook-not-executed-for0first-deployment/)

##3-1 EC2インスタンスにIAMロールを作成する##

EC2に以下のIAMロールのポリシーで作成し、EC2にアタッチする。

`AmazonS3FullAccess`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/4fb5ca70-a445-5564-59c1-abcb6060cb50.png)

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

```
wget https://aws-codedeploy-ap-northeast-1.s3.amazonaws.com/latest/install
chmod +x install
sudo ./install auto
```

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

CodeDeployに以下のIAMロールのポリシーで作成する。

`AWSCodeDeployRole`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/9f2338cf-49bd-2e39-9d44-8cb910b62952.png)


##3-4 CodeDeployアプリケーションを用意する##

[アプリケーション名]には、CodeBuildで決めたアプリケーション名を入力してください。
[コンピューティングプラットフォーム]は、EC2。
![スクリーンショット 2019-03-27 19.42.25.png](https://qiita-image-store.s3.amazonaws.com/0/280929/da420e73-1024-d9f2-d536-6f79aac9e5e0.png)

デプロイグループの作成
[デプロイグループ名]に任意のものを入力。
![スクリーンショット 2019-03-27 19.46.09.png](https://qiita-image-store.s3.amazonaws.com/0/280929/c4d4938d-e490-c474-a299-d53aef7765c7.png)

[サービスロール]は、「3-3 CodeDeploy用のIAMロールを作成する」で作成したものを選択。
![スクリーンショット 2019-03-27 19.47.10.png](https://qiita-image-store.s3.amazonaws.com/0/280929/a177c709-8f65-47dd-e147-2b36a6534a76.png)

[デプロイタイプ]はインプレース。
![スクリーンショット 2019-03-27 19.49.32.png](https://qiita-image-store.s3.amazonaws.com/0/280929/bcf50382-62e5-4396-280b-91b53f8c0669.png)

[環境設定]はAmazon EC2 インスタンス。
![スクリーンショット 2019-03-27 19.50.20.png](https://qiita-image-store.s3.amazonaws.com/0/280929/f94b8f32-e6d3-ed21-9459-929a6036e79f.png)

[デプロイ設定]は、CodeDeployDefault.AllAtOne。
![スクリーンショット 2019-03-27 19.53.03.png](https://qiita-image-store.s3.amazonaws.com/0/280929/5156e25d-afee-4915-e88c-1d3c6b62e4e2.png)

[ロードバランサー]も指定。
![スクリーンショット 2019-03-27 19.53.19.png](https://qiita-image-store.s3.amazonaws.com/0/280929/90e4af4f-e6b0-e1c3-bca7-66cedc3838ed.png)

##3-5 CodeBuildを開始する##

CodeBuildから[Start build]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/906ee056-3ff4-4b20-589d-3c61c6dd4da0.png)

```
[Container] 2019/03/27 11:15:26 Waiting for agent ping
[Container] 2019/03/27 11:15:29 Waiting for DOWNLOAD_SOURCE
[Container] 2019/03/27 11:15:33 Phase is DOWNLOAD_SOURCE
[Container] 2019/03/27 11:15:33 CODEBUILD_SRC_DIR=/codebuild/output/src359827589/src/git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/demo-codcommit
[Container] 2019/03/27 11:15:33 YAML location is /codebuild/output/src359827589/src/git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/demo-codcommit/buildspec.yml
[Container] 2019/03/27 11:15:33 Processing environment variables
[Container] 2019/03/27 11:15:33 Moving to directory /codebuild/output/src359827589/src/git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/demo-codcommit
[Container] 2019/03/27 11:15:33 Registering with agent
[Container] 2019/03/27 11:15:33 Phases found in YAML: 1
[Container] 2019/03/27 11:15:33 BUILD: 1 commands
[Container] 2019/03/27 11:15:33 Phase complete: DOWNLOAD_SOURCE Success: true
[Container] 2019/03/27 11:15:33 Phase context status code: Message:
[Container] 2019/03/27 11:15:33 Entering phase INSTALL
[Container] 2019/03/27 11:15:33 Phase complete: INSTALL Success: true
[Container] 2019/03/27 11:15:33 Phase context status code: Message:
[Container] 2019/03/27 11:15:34 Entering phase PRE_BUILD
[Container] 2019/03/27 11:15:34 Phase complete: PRE_BUILD Success: true
[Container] 2019/03/27 11:15:34 Phase context status code: Message:
[Container] 2019/03/27 11:15:34 Entering phase BUILD
[Container] 2019/03/27 11:15:34 Running command aws deploy push --region ap-northeast-1 --application-name leomaro --s3-location s3://leomaro-codebuild/sample.zip --source src
To deploy with this revision, run:
aws deploy create-deployment --application-name leomaro --s3-location bucket=leomaro-codebuild,key=sample.zip,bundleType=zip,eTag=cc07369e1d36342a99f827d40358d26f,version=q_0JhOdGpyuCg5B1lsavI4Avd5lqnaFa --deployment-group-name <deployment-group-name> --deployment-config-name <deployment-config-name> --description <description>
 [Container] 2019/03/27 11:15:40 Phase complete: BUILD Success: true
[Container] 2019/03/27 11:15:40 Phase context status code: Message:
[Container] 2019/03/27 11:15:40 Entering phase POST_BUILD
[Container] 2019/03/27 11:15:40 Phase complete: POST_BUILD Success: true
[Container] 2019/03/27 11:15:40 Phase context status code: Message:
[Container] 2019/03/27 11:15:40 Expanding base directory path: src
[Container] 2019/03/27 11:15:40 Assembling file list
[Container] 2019/03/27 11:15:40 Expanding src
[Container] 2019/03/27 11:15:40 Expanding artifact file paths for base directory src
[Container] 2019/03/27 11:15:40 Assembling file list
[Container] 2019/03/27 11:15:40 Expanding **/*
[Container] 2019/03/27 11:15:40 Found 5 file(s)
[Container] 2019/03/27 11:15:40 Updating artifact name as sample.zip
[Container] 2019/03/27 11:15:40 Phase complete: UPLOAD_ARTIFACTS Success: true
[Container] 2019/03/27 11:15:40 Phase context status code: Message:
```

CodeDeployのRevisionに作成されていることがわかります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/280929/de3d005f-41f5-6d0e-985f-a93d9afd85c3.png)


##3-6 デプロイする##

作成されたRevisionを指定してデプロイしていきます。

[デプロイ]から[デプロイの作成]
![スクリーンショット 2019-03-30 2.32.07.png](https://qiita-image-store.s3.amazonaws.com/0/280929/73b2cc94-720a-5499-eec0-4c114559742b.png)

[デプロイグループ]は「3-4 CodeDeployアプリケーションを用意する」で作成されたものを指定。
[リビジョンの場所]で「3-5 CodeBuildを開始する」で作成されたものを指定。
![スクリーンショット 2019-03-30 2.36.45.png](https://qiita-image-store.s3.amazonaws.com/0/280929/e483ddf5-c7c4-157d-e0c7-5fe9dba7f599.png)

これでデプロイは完成です。


#4.CodePipeline#

- 継続的デリバリーをサポートするサービス
- Codecommit/CodeBuild/CodeDeployの流れをパイプラインとして定義することで、ソースコードがコミットされたらデプロイまで自動化

##4-1 パイプラインを作成する##

Step 1：パイプラインの設定を選択する
[パイプライン名]には任意の名前を入力。
[Service role]はNew service roleでここで新しく作成します。
[アーティファクトストア]はカスタムロケーションでS3バケットを指定します。
![スクリーンショット 2019-03-30 3.07.17.png](https://qiita-image-store.s3.amazonaws.com/0/280929/0177fa1f-fc73-d1b0-9f88-9054cfaeeb00.png)

Step 2：ソースステージを追加する
[ソースプロバイダー]はAWS Codecommitにし、「1.CodeCommit」で作成したものを指定していきます。
![スクリーンショット 2019-03-30 3.10.24.png](https://qiita-image-store.s3.amazonaws.com/0/280929/ddba2abe-48f2-81a1-f2ac-e3e4f706efe6.png)

Step 3：ビルドステージを追加する
[プロバイダーを構築する]はAWS CodeBuildにし、「2.CodeBuild」で作成したものを指定していきます。
![スクリーンショット 2019-03-30 3.11.39.png](https://qiita-image-store.s3.amazonaws.com/0/280929/748c9de3-d47f-8ce2-28e3-b00da7c3a403.png)

Step 4：デプロイステージを追加する
[デプロイプロバイダー]をAWS CodeDeployにし、「3.CodeDeploy」で作成したものを指定していきます。
![スクリーンショット 2019-03-30 3.15.16.png](https://qiita-image-store.s3.amazonaws.com/0/280929/d75dd1bc-02a6-a996-478e-f395be80e366.png)

Step 5：レビュー
「パイプラインを作成する」

Pipeline作成時と、CodecommitのPush時に動作します。
なので、ここでは何も変わらないので次で動作を確認してみる。


##4-2 CodecommitでPushし動作を確認する##

ファイルを作成してPushする。

```
git add -A
git commit -m "fix."
git push origin master
```

コンソール上から動作しているか確認してみましょう。
![スクリーンショット 2019-03-30 3.31.27.png](https://qiita-image-store.s3.amazonaws.com/0/280929/789cf08e-5b9d-9c2f-ecba-9d994ba8b328.png)![スクリーンショット 2019-03-30 3.31.47.png](https://qiita-image-store.s3.amazonaws.com/0/280929/d08e3fb8-09d6-dc45-696e-01f20be33ab1.png)![スクリーンショット 2019-03-30 3.31.58.png](https://qiita-image-store.s3.amazonaws.com/0/280929/1ca060d3-25f0-fffc-44e3-939251e080b1.png)