[AWS] CodeCommit + CodeBuild + CodePipeline + S3で静的コンテンツをデプロイする環境を作ってみる！

## はじめに

AWSを使っている現場では働いたことあるけど環境を0から構築したことないな〜という人です。
今回は検証用に「**AWSマネジメントコンソール**」を使って動くものを構築した手順を簡単にメモしています！
詳細を省いているので随時追加していく予定です。


## AWSにアクセスする方法

AWSにアクセスし利用する方法としては下記3パターンあるようです。


| AWSマネジメントコンソール | CLI | SDK |
|:-----------|------------:|:------------:|


３パターンの比較については下記記事などを参考

参考：https://aws.taf-jp.com/blog/18947

今回はAWSが初めてでも扱いやすそうな「**AWSマネジメントコンソール**」を使用します！

## 1. CodeCommitでリポジトリを作成する

1. https://console.aws.amazon.com/codesuite/codecommit/home で CodeCommit コンソールを開きます。

2. リージョンセレクタで、リポジトリを作成する AWS リージョン を選択します。
> アジアパシフィック（東京）
3. [Repositories (リポジトリ)] ページで、[Create repository (リポジトリの作成)] を選択します。

4. [Create repository (リポジトリの作成)] ページの [Repository name (リポジトリ名)] に、リポジトリの名前を入力します。

5. (オプション) [Description (説明)] にリポジトリの説明を入力します。

6. (オプション) [Add tag] を選択して 1 つ以上のリポジトリタグ (AWS リソースを整理して管理するのに役立つカスタム属性ラベル) をリポジトリに追加します。
※リポジトリのタグ付けについて（https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/how-to-tag-repository.html）

7. (オプション) このリポジトリに Java または Python コードが含まれており、CodeGuru Reviewer で分析する場合は、[Enable Amazon CodeGuru Reviewer for Java and Python] (Java および Python 用に Amazon CodeGuru Reviewer を有効化) を選択します。
> 選択しない

8. [Create] を選択します。

参考: [AWS CodeCommit リポジトリを作成する(コンソール)](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/how-to-create-repository.html#how-to-create-repository-console)

## 2. S3にバケットを作成する

1. [バケットを作成] - バケット名を入力する
2. [バケットを作成] - AWS リージョンを選択する

> アジアパシフィック（東京）

3.[オブジェクト所有者]

> ACL 有効

4.[このバケットのブロックパブリックアクセス設定]

> 全てチェックを外す(「パブリックアクセスをすべてブロック」のチェックを外す)

5.「バケットを作成」をクリックする


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

1. AWS CodeBuild コンソール (https://console.aws.amazon.com/codesuite/codebuild/home) を開きます。

2. ビルドプロジェクトを作成するを選択します。

3. [プロジェクトの設定] - プロジェクト名を入力する

4. [ソース] - ソースプロバイダを選択する
> 「AWS CodeCommit」を選択する

5. [ソース] - リポジトリを入力する

6. [環境] -  環境イメージを選択する
> マネージド型イメージ

7. [環境] -  オペレーティングシステムを選択する
> Amazon Linux 2

8. [環境] - サービスロール
> 「新しいサービスロール」

9. [Buildspec] - ビルド仕様を選択する
> 「buildspec ファイルを使用する」

10. [アーティファクト] - タイプを選択する
> Amazon S3

11. [アーティファクト] - バケット名を入力する
>  **2. S3にバケットを作成するで作成したバケット名**

12. 「ビルドプロジェクトを作成する」をクリックする


参考：[AWS CodeBuild ビルドプロジェクトの作成 (コンソール)](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/create-project-console.html)

## 4. CodePipelineでビルド&デプロイのプロセスを自動化する

1. AWS Management ConsoleCodePipeline コンソール(http://console.aws.amazon.com/codesuite/codepipeline/home)を開く

2.「パイプラインを作成する」をクリック
3.  [パイプラインの設定を選択する] - パイプライン名を入力する
4. [パイプラインの設定を選択する] - サービスロールを選択する
> 新しいサービスロール

5. [ソースステージを追加する] - ソースプロバイダーを選択する
> AWS CodeCommit

6.  [ソースステージを追加する] - リポジトリ名を入力する
7.  [ソースステージを追加する] - ブランチ名を入力する
8. [ビルドステージを追加する] - プロバイダーを構築するを選択する
> AWS CodeBuild

9. [ビルドステージを追加する] - リージョンを選択する
> アジアパシフィック（東京）
10. [ビルドステージを追加する] - プロジェクト名を入力する
11. [ビルドステージを追加する] - 環境変数を追加する
> ビルド時に必要な環境変数を設定　ex) API_KEYなど

12. [ビルドステージを追加する] ビルドタイプを選択する
> 「単一ビルド」

13. [デプロイステージを追加する] 導入段階をスキップするをクリック

14. [レビュー]パイプラインを作成するをクリック

## 5. ロールのアクセス権限を設定する
**手順2で作成したCodeBuildのプロジェクトにS3へのアクセス権限を付与する**

1. ロール > [プロジェクト名]へアクセス
2. 「アクセス権限」タブを選択
3. 下記のポリシーを追加する

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "kms:GenerateDataKey",
                "s3:PutObject"
            ],
            "Resource": "${S3のリソース}"
        }
    ]
}
```

4.Amazon S3 > [プロジェクト名]へアクセス
5.「アクセス許可」タブを選択
6.「バケットポリシー」へ下記のポリシーを追加する

```json
{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "${S3のリソース}"
        }
    ]
}
```



## 終わりに

かなり雑に一旦書いてしまった。。！
このあと**CloudFront + S3環境構築手順（CloudFront経由のみS3へのアクセスを許可する）** についてもまとめる予定です。
AWSの資格勉強したくなってきたー:muscle: