GitHubのソースをEC2にデプロイする

CodeDeploy/CodePipelineを設定した際の備忘録です。


## 経緯

現在、EC2で、Apache/PHPを使用しています。
Pushの度にPullしていますが、そこを自動化してはどうか？とご提案頂いたので、
CodeDeploy/CodePipelineを使って、GitHubリポジトリをデプロイしてみます。
ちなみに、AWSは初心者です。

手順は以下を参考に実施しました。
　https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/tutorials-github.html
　https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/tutorials-four-stage-pipeline.html

Pushを契機に自動的にデプロイしたいですが、まずは、CodeDeployからデプロイしてみます。

## 環境

- EC2インスタンス
    - AWS CLIインストール済み
- ALB
- GitHubにリポジトリ
    - ２段階認証：有効

AWS CLIのインストールは、以下を参照して実施しました。
　https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/getting-started-configure-cli.html


## AppSpec fileファイルの作成（appspec.yml）

CodeDeployを実施した際、appspec.ymlの内容に従ってデプロイされます。
DocumentRootにデプロイしたかったのですが、そのままでは使えない構成となっていたため、

- 一旦、user配下（/home/hoge）にデプロイ
- シェル（shells/initialize.sh、shells/update.sh）を起動

によって、DocumentRoot配下に展開するようにしています。

```appspec.yml
version: 0.0
os: linux
files:
  - source: /
    destination: /home/hoge/test_repo
hooks:
  BeforeInstall:
    - location: shells/initialize.sh
  AfterInstall:
    - location: shells/update.sh
```

appspec.ymlの詳細に関しましては、以下を参照願います。
　https://docs.aws.amazon.com/ja_jp/codedeploy/latest/userguide/reference-appspec-file.html#appspec-reference-server


## CodeDeployのサービスロール作成

 1. **IAM**コンソールを開く
 
 2. ナビゲーションペインで**ロール**を選択、**ロールの作成**ボタンを押下する
 
 3. 以下を選択して、**次のステップ：アクセス権限**ボタンを押下する
    信頼されたエンティティの種類　　　　：**AWSサービス**
    このロールを使用するサービスを選択　：**CodeDeploy**
    ユースケースの選択　　　　　　　　　：**CodeDeploy**

 4. Attached アクセス権限ポリシーに**AWSCodeDeployRole**が表示されていることを確認、
    **次のステップ：タグ**ボタンを押下する

 5. 必要に応じて、タグの設定を行う（オプション）
    **次のステップ：確認**ボタンを押下する

 6. ロール名を入力する (例: CodeDeployServiceRole)
    **ロールの作成**ボタンを押下する

 7. ロールの一覧より、ロールが作成されていることを確認する

## アプリケーションの作成

 1. ** CodeDeploy**コンソールを開く
 
 2. ナビゲーションペインで**アプリケーション**を選択、**アプリケーションの作成**ボタンを押下する

 3. 以下を入力/選択して、**アプリケーションの作成**ボタンを押下する
    アプリケーション名　　　　　　　　　：**（任意）**
    コンピューティングプラットフォーム　：**EC2/オンプレミス**

## デプロイグループの作成

 1. **デプロイグループ**タブを選択、**デプロイグループの作成**ボタンを押下する

 2. 以下を入力/選択して、**デプロイグループの作成**ボタンを押下する

    デプロイグループ名　　　　　　　：**（任意）**
    サービスロール　　　　　　　　　：**[CodeDeployのサービスロール作成]**で作成したロールを選択
    デプロイタイプ　　　　　　　　　：**インプレース**
    環境設定　　　　　　　　　　　　：**Amazon EC2 インスタンス**
    キー／値　　　　　　　　　　　　：**（デプロイ先のEC2インスタンスを選択）**
    デプロイ設定　　　　　　　　　　：**CodeDeployDefault.OneAtATime**
    ロードバランシングを有効にする　：**チェックを外す**

## デプロイの作成

 1. **デプロイグループ**タブを選択、[デプロイグループの作成]で作成したデプロイグループをクリックする

 2. **デプロイの作成**ボタンを押下する

 3. 以下を入力/選択して、**デプロイの作成**ボタンを押下する

    デプロイグループ　　　　　　　　　：**[デプロイグループの作成]**で作成したデプロイグループを選択
    リビジョンタイプ　　　　　　　　　：**アプリケーションは GitHub に格納されています**
    GitHub トークン名 　　　　　　　　：**（接続したいGitHubトークン名を入力）**
　　　　　　　　　　　　　　　　　　　※ **GitHubに接続**ボタンを押下して、使用したいGitHubアカウントでログインする
    リポジトリ名　　　　　　　　　　　：**（GitHubトークン名）/（デプロイしたいリポジトリ名を入力）**
    コミットID　　　　　　　　　　　　：**（デプロイしたいコミットを入力）**
    デプロイグループのオーバーライド　：（変更なし）
    追加のデプロイ動作設定　　　　　　：（変更なし）
    ロールバック設定の上書き　　　　　：（変更なし）


ここで、デプロイが実行されます。

もし、失敗していた場合、ナビゲーションペインで**デプロイメント**を選択すると**デプロイ履歴**が表示されます。
失敗した**デプロイメID**をクリックすると画面が切り替わりますので、
**デプロイのライフサイクルイベント**の**View events**をクリックします。

こちらにエラーメッセージ、及びどのイベントで失敗したのかを確認することが出来ます。

次にPushのタイミングで、デプロイするため、CodePipelineの作成を行います。

## CodePipelineの作成

 1. **CodePipeline**コンソールを開く
 
 2. ナビゲーションペインで**パイプライン**を選択、**パイプラインを作成する**ボタンを押下する

 3. **パイプラインの設定を選択する**の画面で、以下を入力/選択して、**次に**ボタンを押下する

    パイプライン名　　　　　　　　　：**（任意）**
    サービスロール　　　　　　　　　：**新しいサービスロール**
    ロール名　　　　　　　　　　　　：**（任意）**
    サービスロール名の入力　　　　　：チェックを入れる
    アーティファクトストア　　　　　：**デフォルトのロケーション**

 4. **ソースステージを追加する**の画面で、以下を入力/選択して、**次に**ボタンを押下する

    ソースプロバイダー　　　　　　　：**GitHub**
　　　　　　　　　　　　　　　　　※ **GitHubに接続**ボタンを押下して、使用したいGitHubアカウントでログイン
    リポジトリ　　　　　　　　　　　：**（デプロイしたいリポジトリを選択）**
    ブランチ　　　　　　　　　　　　：**（デプロイしたいブランチを選択）**
    検出オプションを変更する　　　　：**GitHub ウェブフック (推奨)**

 5. **ビルドステージを追加する**の画面では、**ビルドステージをスキップ**ボタンを押下する

 6. **デプロイステージを追加する**の画面では、以下を入力/選択して、**次に**ボタンを押下する

    デプロイプロバイダー　：**新しいサービスロール**
    リージョン　　　　　　：**（任意）**
    アプリケーション名　　：**[アプリケーションの作成]**で作ったアプリケーション名を選択
    デプロイグループ　　　：**[デプロイグループの作成]**で作ったデプロイグループを選択

 7. **レビュー**の画面では、入力内容を一通りチェックして、**パイプラインを作成する**ボタンを押下する


ここで、CodePipeline起動後、CodeDeployが起動します。
成功したら、実際にPushして、CodePipelineが起動するか確認して終了となります。