AWS Code サービス群を活用して、CI/CD のための構成

## 目次
・趣旨目標
・参考サイト
・使用するサービス
・勝手なイメージ
・ハンズオン
・リソースの削除
・さいごに

## 趣旨目標
ハンズオンを通じて基礎知識を身に付ける！Code群のサービスが少し謎なので理解！

## 参考サイト

https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-cicd-2022-confirmation_484.html

## 使用するサービス
CodeCommit, AWS CodeBuild, AWS CodeDeploy, AWS CodePipeline

## 勝手なイメージ
ハンズオンする前は、GitHubとの違いを理解するのに最初は苦しみました。

## ハンズオン
### S3を使ったCI/CD環境を構築
・リージョンをチェック
・S3作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/edbdf832-aa6f-019e-6fac-d24a76617455.png)
静的webサイトホスティングとして使用するので、赤枠のチェックを外しちゃいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/85a0927c-8604-1c17-6871-b4025b926a0a.png)

プロパティから、静的webサイトホスティングの編集で、有効に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/6778a9ab-248a-09ac-0184-79ba598b7190.png)
「index.html」を指定しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/02af22f1-f21c-4441-dfd6-62a042246144.png)
アクセス許可のタブから、バケットポリシーを編集していきます。
次のポリシーは、S3のオブジェクトを読み取りすることができる設定とするものです。なお、Resourceの箇所はバケット名を入れます。
```
{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Sid": "PublicReadGetObject",
          "Effect": "Allow",
          "Principal": "*",
          "Action": [
              "s3:GetObject"
          ],
          "Resource": [
              "arn:aws:s3:::xxxxxxxxx/*"
          ]
      }
  ]
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/96616b19-4e4f-7a56-7cee-3c36616b4e26.png)

オブジェクトをアップロードをしていきます。
オブジェクトタブから、ハンズオンサイトにあるファイルをダウンロードして、index.htmlデータをアップロードします。（ご自分で作成しても良いかと。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/5e95eb35-5674-851e-3a56-09ba2953fcb3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/3d62bf9b-60c5-43ea-73fb-7df4e14b4353.png)

S3のURLをブラウザに貼り付けることで、次のhtmlが表示されたらOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/1d303a8a-c398-b918-b5a2-a40be9036b3d.png)
画面を保持してタブを複製して作業を続けましょう。

### CodeCommitを設定していく
リポジトリを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/93b734c2-c058-f0f8-7edc-72f819693b91.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/dc0d79bb-16aa-6511-3beb-8bb051d84bc7.png)
画面を保持してタブを複製して作業を続けましょう。

### Cloud9を使用します。
テキストエディタの発展版のような存在ですね。協同で接続して開発が可能なようです。もっと売れて良さそう|дﾟ)
環境を作成していきます。
重い作業を行う場合は、インスタンスタイプを大きくしましょう。今回は最小でいきます。また、自動でEC2インスタンスを停める時間を設定できるのですが、今回の設定では時間切れにはなりませんが、結構長めに設定した方が作業環境としては快適です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/2177f88e-26d3-8b6c-fda0-33ffa19293fa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/650eea7d-9cad-bbb6-9604-869954d35605.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/353168a2-a1f5-aae5-9560-0f1e9c0044e5.png)
「開く」から設定を開始します。

インデントの設定を行います。
赤枠内「雲マーク」から「Soft Tabs」をyamlに合わせて「2」に設定します。
codeをcommitするために、認証ヘルパーというコードを実行して環境を構築します。

蛇足：
gitをローカルにインストールしてマネジメントコンソールからgitcommit用のユーザー名とパスを生成する方法もあると思います。gitをインストールしたらIAMからパス等を生成しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/de27a70e-e83a-6881-aa0c-c039f9ae1c70.png)
パスは必ずダウンロードしましょう。あとは、S3の画面でクローンのコマンドが表示されているので、git自体のユーザー名とアドレス設定を行った後に、ローカルのターミナルで実行して使用しましょう。

git自体のグローバルでの名前
```:ターミナル
git config --global user.name "あなたの名前"
```
アドレス設定
```:ターミナル
git config --global user.email "あなたのメールアドレス"
```

私の場合のS3に記載されているクローンのコマンド
```:ターミナル
git clone https://git-codecommit.us-east-1.amazonaws.com/v1/repos/keiji-hanson-commit
```
現状リポジトリが空ですが、これでローカルで実行可能です。
ここで蛇足終わりです。


本線に復帰します。
「AWS 認証ヘルパー」とブラウザで検索して、gitが認証を必要とするたびに、認証情報を提供するために次のコマンドを実行。

公式サイト：
https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-https-unixes.html

```:Cloud9
git config --global credential.helper '!aws codecommit credential-helper $@'
git config --global credential.UseHttpPath true
```
昔懐かしのgitの初期設定を放り込みます。
グローバルでの名前
```:Cloud9
git config --global user.name "あなたの名前"
```
アドレスを指定
```:Cloud9
git config --global user.email "あなたのメールアドレス"
```
Cloud9のターミナルでこれまでのコマンドを実行可能なことを確認したら、gitのルートディレクトリに移動し、ブランチ名が（master）であることを確認します。
ルートディレクトリが不明である場合は、CodeCommitで設定したリポジトリ名の数文字を入力してTabキーを押下することで、ルートディレクトリを表示してくれます。もちろん記憶していればそのまま記載しても良いです。
```:Cloud9
例：cd keiji-hanson-commit/
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/04f6667a-c95d-6a16-5a83-453cbf9a04fd.png)
(pwdコマンドは実行しなくても大丈夫です。)

次にCloud9上にもハンズオン資料のindex.htmlをアップロードしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/0d509c2d-810a-d47c-1161-76e92b784a45.png)

リポジトリ内が空であることを確認しておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/bc5e925d-2be9-4537-1e16-1167df800236.png)

gitコマンドを実行してきます。
変更された箇所の全てをステージングして。
```:Cloud9
git add -A
```
ステージングされた全てをコミットします。
```:Cloud9
git commit -m "init"
```
リポジトリにアップロードする。
```:Cloud9
git push origin master
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/8341e526-d1a5-1738-87ff-f64a26dc6129.png)

今こんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/05e47d6a-ec15-3e21-c566-cee39af6dace.png)


### 次は赤枠のS3宛てとEC2宛てのパイプライン計２本を作成していく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/6e30ed16-a049-406f-7869-76ef58eb163d.png)


#### 【ここで少しお勉強です。（私見盛りだくさんなので無視可）】
１　全般、一言で表現するとgitのブランチとかの感じ。
ブランチとして分ける場合は、パイプラインを分けて作成することで実現できるようです。
２　パイプラインタイプというものは、V1 タイプ、V2 タイプに価格と自由度が分かれており、自由度高く設定できる。デフォはV2タイプ。gitに慣れている方はこちらにしないと困りそう。
公式サイトでの説明：
https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/pipeline-types.html



#### 本編に戻ります。
先にCdodePipelineから作成します。
V2 タイプ（デフォルト）で作成を進めます。
Pipelineを２つ作成します。最初はS3に対してのPipeline作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/0389c1e0-392f-5e2b-288b-1f2e47a2a7b9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/d805b485-f724-3bba-ab5e-0c86015ca49e.png)

ここで各ステージ間で受け渡しされる変数を作成することができます。また、Lambdaを介すことで動的に変数を設定させることもできるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/c3f986f7-659a-df07-9cbf-ccb4df75d14f.png)
変数の設定細部：
https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/reference-variables.html


S3を作成する設定や、KMSキーを使用するかを選べる。
今回は先に作成したS3を指定していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/7f71acfa-3efc-5630-0a2e-2e753873809f.png)
接続先を選択します。S3やCodeCommit、gitなどを選択できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/b6606dcc-5b6f-1f40-f776-9f8350baf63a.png)
masterのみで、ソースはCodeCommitで設定します。
また、WatchEventsで自動的に変更される設定（デフォルト）とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/c33332e8-9a15-f3ea-1683-2b86eb711de3.png)

蛇足：
githubを接続することが可能です。バージョン２を選択し、接続することでgithub上で変更を行うとCI/CD機能が働き、各本番、テスト環境などで自動的に実行される環境が作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/fa65c19f-aca1-6e1e-d9b0-684f1d2135d9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/617a1830-bcf5-172f-c3bb-1b629997d84c.png)
githubと接続するためのアプリのインストールを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/664f8a6c-2520-8045-c326-4733c5264a59.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/5611d543-8378-3a0b-aae8-0f7502c4cca9.png)
数字が自動的に入りますね。このまま実行していまうと、接続が確立されてしまうので、ハンズオンの本編に帰ります|дﾟ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/86dc5ef2-7f78-a271-67c4-c4f46511595a.png)


#### 本編に戻ります。
ビルドステージはスキップします。
S3宛てのパイプラインであり、CodeBuildを介さないためです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/8f81221b-167e-fb19-7cab-9a3bb627a1c8.png)

デプロイステージではS3を宛先に作成していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/5c9bd645-7c18-512b-8753-2ac6dc29f208.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/9c766cbf-73bf-5762-34d6-bd981746860e.png)
オプションが多く設定されていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/df33518a-17d4-0c2a-c00e-c49cc6e805df.png)
このまま次に進み、パイプラインを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/c9889790-33aa-04cb-9f88-7ba51454062d.png)


次にS3へのコミットができるか確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/40e7ca75-b8e4-40ac-b148-425683bf51b2.png)
保存し忘れること多しなので、保存をして、コマンドでコミットしていきます。
コミットの際はコメントを任意に入力する必要があります。
ここで更に注意事項ですが、gitのリポジトリ（gitと繋がったディレクトリ）があるディレクリに移動する必要があります。
pwdコマンドやlsコマンドで移動すべきディレクトリに移動しましょう。
早速、add、commitとpushを行います。
add
```:Cloud9
git add -A
```
commit
```:Cloud9
git commit -m "update"
```
push
```:Cloud9
git push origin master
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/b205ce4d-e8aa-7d94-f2a7-a89c14f63877.png)
できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/d7faf8ad-bd95-23dc-6270-21a32f702974.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/b08c0449-be56-3404-a6f7-8991b8c1123e.png)

### EC2にwebサーバーを構築する。
IAMロールの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/1325b90c-1246-a8d0-3083-3567e8f59888.png)
EC2を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/29a4e39f-0e03-107d-f7c6-3a485ab56144.png)
S3フルアクセスを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/2fe1e99c-4b90-83a4-9227-40f0eab0243c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/92f9cc62-cc97-1d5f-515a-6e2082aac885.png)

EC2作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/932ba9d6-cea4-e11a-8d66-cc7a0cbc9232.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/4312da3f-a46e-2886-77ed-801bd99cfd01.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/f24eb432-afbb-d2a2-e1be-88b578e648d0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/6d6ba332-1d77-319b-46f9-faf54f55b487.png)
ネットワーク設定は、HTTPを許可する設定を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/a3c93539-8d7f-575c-debc-508c5e9049c9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/77158b51-f13b-edc2-a5b6-5517a550cf44.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/61a31908-f421-a577-e83b-8a5ec0e6f0e3.png)

先程作成したIAMロールを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/dfbf845b-69f2-cd14-30a7-dfaee8862950.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/8f1aec4e-3b7a-4280-48a3-fe666496c074.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/bfec68fd-8e67-5040-8d4d-4be00bbfee0f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/230f6933-9b50-cf2e-88f5-8bd4f4124a76.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/01053d52-69d8-c79a-b05b-3ec8cbb1b169.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/bd4945e0-f7e1-fddc-fb42-6c82913a6448.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/a7ec57dd-0545-62b7-3a41-928fd6fde2b1.png)
インスタンスに接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/49a444bb-71c5-4951-4d78-b24f69d1ae47.png)
yumを最新へ。
```
sudo yum update -y
```

Apacheをインストール
```
sudo yum install httpd -y
```
Apacheの起動
```
sudo systemctl start httpd.service
```
Apache自動起動設定
```
sudo systemctl enable httpd.service
```
EC2のパブリックアドレスをブラウザへペーストすると次のwelcomeが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/c4b39ed8-79bc-3a7d-0c02-8b861c768feb.png)

次にCodeDeployのLinux用エージェントをインストールします。
公式サイト：
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/codedeploy-agent-operations-install-linux.html
Rubyをインストール
```
sudo yum install ruby
```
ファイルをダウンロードするためもの
```
sudo yum install wget
```
私の場合のインストーラーのコマンド。こちらを確認ください。
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/resource-kit.html#resource-kit-bucket-names
```
wget https://aws-codedeploy-us-east-1.s3.us-east-1.amazonaws.com/latest/install
```
ディレクトリに権限を与えてから
```
chmod +x ./install
```
権限を確認していきます。
```
ls -la
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/c4d33956-0578-dc22-e20f-261f0d4c0180.png)
CodeDeploy エージェントの最新バージョンをインストール
```
sudo ./install auto
```
サービスが実行されているかどうか確認
```
systemctl status codedeploy-agent
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/9385e981-afed-1afd-4abf-07adfc79366c.png)
ここまででEC2の初期設定完了！

### S3を作成します。
CloudBuildで作成したアーティファクト（成果物）を格納するためのS3を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/a62947fa-3640-46a5-0972-1e870dcfe76a.png)
今回はwebホスティングしないので公開せず、デフォルト作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/3a93b290-e2d9-8e65-1d52-6786cd528276.png)

### CodeBuildを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/a28c6a44-c7ef-f64d-efa7-24cf41b9f83c.png)
ここの追加設定には同時ビルドの設定などが可能ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/fe464fd3-0243-e630-80e6-3ca45ab2201a.png)
CodePipelineで設定した内容に合わせブランチを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/66471947-c0b5-3d4e-0693-8b92724590ce.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/d782c728-c233-422e-a014-0f73e4c909d0.png)
Linuxを選択し、最新のイメージ、バージョンを選択します。
動画などの処理を行うこともないので、GPU 強化コンピューティングにはチェックを付けません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/60c36398-495a-5a38-7b51-95247e86777d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/a953d469-1198-c5f7-6201-49356e746188.png)
追加設定はマニアックですね。貼っておきますので参考までに。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/495c6cd7-4487-1350-4ca9-e44400986349.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/3b59b0f4-194a-844b-da93-07ff3ef37fe7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/6aa9910f-5357-d836-67a2-a5fc7e14947d.png)
動的な振る舞いを決めることができる箇所
特定のタグを自動で付ける等、少しだけアレンジできるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/45804fda-6f5b-5d91-f07f-17570585baa0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/695fd2c6-fbb6-a85b-775f-b70c16e6fb83.png)
先程作成したS3を選択していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/bb85a53f-0e4f-42a1-7aa4-5df851df2359.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/2275e547-6d36-f08e-aaa9-4b2ceb2ea9b8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/1bb610c0-099f-17c8-7c4c-293544931f70.png)
ログも取れるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/c2fe5bf2-70b0-55e5-308e-77e4277396d7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/c33fc1fc-8a98-52d6-e227-81e705529742.png)

ここでIAMロールにポリシーをアタッチしていきます。
IAMの画面へ移動し、CodeBuildからCodeDeployにアクセス可能にするため、IAMロールの画面で「CodeBuild」と検索し、作成されたロールを発見します。その後、ポリシーを画像のように追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/5eb4a026-2af2-0a98-fc93-00732ce3d618.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/6aac7fbf-f6b2-ee1b-bf46-2f75b4e4b83e.png)

私の場合「keiji-hanson-commit」直下にファイル「buildspec.yml」ディレクトリ「src」を作成。そして「index.html」を「keiji-hanson-commit」へドラック＆ドロップで格納する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/4a978d23-5864-2b43-ed18-d6e02c9ba341.png)


### buildspec.ymlを作成します。
この後にCodeDeployにpushするので、その際の動作（アプリの名前決め）を決めるために、コードを作成します。
公式サイト：
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-spec-ref.html
#### ※修正前：このコードは完成ではありません。
このテンプレートが公式サイトにありますのでコピーしてきます。
```:yml
# ビルドスペックのバージョンを指定
version: 0.2

# フェーズ分けしますよ。
phases:

# HelloWorld_spec.rbというRubyテスト実行コードをビルド中にやりますよ。つまりやりたい動作を書く。
  build:
    commands:
      - rspec HelloWorld_spec.rb

# 成果物（アプリ）について記載しますよ。
artifacts:

# 保存先ディレクトリ
  files:
# 成果物（アプリ）に関するファイル全て保存しますよ。
    - '**/*'

# 成果物の名前を次のかたちで作成しまっせ。
  name: myname-$AWS_REGION 
```
改良します。
Cloud9に貼り付けて作業します。
１　名前（name）は不要であるため削除

２　次のリンクを参考に、コードの加除を行う。
公式サイト：
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/application-revisions-push.html
「rspec HelloWorld_spec.rb」を「aws deploy push」に置き換える。
つまり、プッシュします。ということ。このプッシュにはオプションを指定できるので、「 --application-name ☆☆☆」を追記する。☆は後で入れる。

３　S3のロケーションを追記する。「 --s3-location s3://バケット名/ファイル名 ソースはココにある」スラッシュ以下は実際に作成したバケットなど確認。
実際のバケット名：keiji-artifact-s3
作りたいファイル名：artifact.zip
ディレクトリ： --source src

４　「base-directory:src」を最終行に追加する。
#### 修正結果↓↓↓
```:yml
# ビルドスペックのバージョンを指定
version: 0.2

# フェーズ分けしますよ。
phases:
  build:

# S3にaws deploy pushするよ。名前は☆☆☆。
    commands:
      - aws deploy push --application-name ☆☆☆ --s3-location s3://keiji-artifact-s3/artifact.zip --source src

# 成果物（アプリ）について記載しますよ。
artifacts:
# 保存先ディレクトリ  
  files:
# 成果物（アプリ）に関するファイル全て保存しますよ。  
    - '**/*'
# ここに成果物を置くことにしているよ。
　base-directory: src
```

### IAMロールを作成します。
新規にIAMロールを作成し、CodeDeployにアタッチするロールを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/d01f1adc-7e76-bd8a-d280-1ff67f2d902e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/c53f939c-9c1c-0ec4-8760-150cacdbd19e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/f7f1acad-e8ea-de34-e167-6d064e919499.png)

### Codedeployでアプリを作成していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/75ba755d-f590-85f8-8ad4-f4f781b15481.png)
アプリケーションを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/29b3a8e8-f16c-f918-6361-7f3d191213c6.png)

アプリケーション名がわかったので、Cloud9で作成中のコードに追記します。
完成です。
```:yml
version: 0.2
phases:
  build:
    commands:
      - aws deploy push --application-name keiji-codedeploy-app --s3-location s3://keiji-artifact-s3/artifact.zip --source src
artifacts:
  files:
    - '**/*'
　base-directory: src
```

デプロイグループを作成します。
オレンジのボタンから作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/3a45cbcd-9dfa-5372-db55-b27711ab4536.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/bf481b74-e0b8-20d8-6611-270bdb038e03.png)
名前は適当に、サービスロールは先程作成したものを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/27159d0f-669a-201a-727a-c7324186242d.png)
ブルーグリーンデプロイメントが選択できますね。
インプレースで進めますが、Blu/Greにすると中断を局限できそうですね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/eeae3a91-4598-2c5c-9930-dc4ebfafa342.png)
先に作成したEC2にデプロイしますよと指定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/8b9d51b4-58e4-88fa-6454-a6b47a721397.png)

CodeDeployエージェントは手作業でインストールしたので、「なし」です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/1310d303-f484-3b26-a748-0ee78af0c004.png)
デプロイを複数台同時にデプロイする場合や、徐々にデプロイするなど、選択できるが、画像のとおり単発でデプロイする方式を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/afcc10a1-d664-1e25-88c0-10948afaeaaa.png)

ロードバランサーは使用しません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/f1d53fee-7e7c-7ba0-8269-5af0bff1a7af.png)
オプションを参考に貼っておきます。
アラームや、SNSの設定もできるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/2174dcad-5c2f-99ad-6862-6456827e8ebf.png)

Cloud9でymlファイルを作成する。
Cloud9にて、「src」配下に「appspec.yml」を作成します。
appspec.ymlの書き方公式資料：
https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/reference-appspec-file.html
使用するコード
```:yml
version: 0.0
os: linux
files:
  - source: index.html
    destination: /var/www/html/
```
保存を必ず行って、次のコマンド
```:Cloud9
git add -A
```
```:Cloud9
git commit -m "create"
```
```Cloud9
 git push origin master
```

早速ビルドを開始していきます。
CodeDeployへ移動し、「ビルドプロジェクト」からプロジェクトにチェックを付けて、ビルドを開始します。
頭の整理ｗ：コミット⇒プッシュ⇒ビルド⇒デプロイ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/589da8bb-5f70-f86e-9a2c-8a315b267c2b.png)

ビルドが出来ましたので、次に成果物（アプリ）をデプロイします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/44af6393-5d0c-bd84-b367-edee21a10c13.png)

プルダウンから先程作成した「web」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/73f8beaa-6113-4964-825c-06ef375486d7.png)

リビジョンの場所は、作成したバケットを選択します。そしてzipを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/856b3981-3c00-2080-1519-c7e7e284f74c.png)
補足としてデプロイの詳細を設定できるようです。参考までに。
このままデプロイのボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/06748077-19e3-484b-c5d6-c0392a6d497a.png)
デプロイできたようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/322047c5-7f7e-926e-d5c3-4ecd77b7f134.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/bbd56355-63ff-0ac1-fded-391ab30b40b7.png)
EC2に移動してブラウザにパブリックアドレスを貼り付けて、確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/812f4916-ab8d-70f2-0be6-596d9e6cc87c.png)
できていますね ^^) _旦~~


### ここから自動化（CI/CD）していきます。
CodePipelineで一気にデプロイしていきます。
EC2を対象として新たにパイプラインを作成します。
※今回は自動で行うので「ビルド」の項目もしっかり設定します。
注意が必要な箇所のみスクショしています。基本的には一回目の設定と同じで大丈夫です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/9816e736-3067-97a2-c6ed-30d1112f41f3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/78c1bc20-d3d7-0977-6324-a03c2e3c6bf1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/36f41baf-1747-a365-ab70-de958fb32e57.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/c43c7426-c9e6-2fb6-d270-f9432b19ce42.png)

### はい。エラーです。
結論「IAMポリシー不足」です。CodeBuildにアタッチしているポリシーがS3からのダウンロード「"s3:GetObject"」権限が必要でした。
```:error
CLIENT_ERROR: error while downloading key keiji-hanson-ec2-2/SourceArti/mQEbB9D, error: AccessDenied: Access Denied status code: 403, request id: 7K1N256HGBXCE8DQ, host id: MEJNzsnBF1YDUM/DV9aiYpO419hTOLRyBwjKETYZqzC0IVnXldgM3dLAgSKWhO0cdCrmW5VxiWU= for primary source and source version arn:aws:s3:::keiji-artifact-s3/keiji-hanson-ec2-2/SourceArti/mQEbB9D
```
翻訳：
「クライアントエラー: キー keiji-hanson-ec2-2/SourceArti/mQEbB9D のダウンロード中にエラーが発生しました。エラー: AccessDenied: アクセスが拒否されました。ステータスコード: 403, リクエストID: EWJSFC1AKTG3KH4E, ホストID: 55kpabAPc/1foAmZRR4svatG9U0EkoP8NkM63Tib/hPN6S+7cBiccEkR0462c7GTLsRaC8+ROT+N4lQVe1gU0g==。主要ソースおよびソースバージョン arn:aws:s3:::keiji-artifact-s3/keiji-hanson-ec2-2/SourceArti/mQEbB9D に対して」

やったこと。
１　コンソール内で結構深くまでエラーを確認することができました。CodeBuildの工程において、アップロードは可能だけれど、そのデータをダウンロードする工程でエラーが発生したことを認識することができました。
２　CodeBuildに権限が不足しているということで、S3へのFullAccessポリシーをアタッチしました。

※この工程で解決することができましたが、本来であれば、FullAccessではなく「"s3:GetObject"」をCodeBuildのロールにアタッチしてあげないといけませんでした。

## リソースの削除
1. Cloud9を削除します。
赤枠からダッシュボードに戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/a596c97a-34b4-ed84-09d0-68e398105d02.png)
ここで削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/d69469a9-8e8f-6514-08d5-34ab612549bb.png)
2. EC2を終了（削除）します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/346b4d6f-b016-a7a5-944b-290f621c5252.png)
3. CodePipelineを削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/793776cf-eac3-92ec-5387-1bbcd62d6629.png)
4. CodeCommitのリポジトリを削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/f5d93e8f-47df-645e-8ac6-b2d9bd79c352.png)
5. CodeBuildのビルドプロジェクトを削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/8aae0465-1a01-92fc-d566-9e867f1c6b57.png)
6. CodeDeployのアプリを削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/8b28cbcc-66d2-398a-c9b7-de25fc31270f.png)
7. S3を削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/10a8cab4-3629-51f2-8992-1ed2e37ed690.png)
















## さいごに
正直何度かやらないと、手際よくはできないと感じます。CI/CDと言えどコマンドは実行するのだなと勉強になりました。ビルドスペックファイルにテストコマンドを記載することで、アプリデプロイに係るテスト自動化など、他のサービスと組み合わせることで益々使いよくなりそうだと感じました。

では！