CodePipeline Getting Started: WordPressのリリースプロセスをPipeline化してみよう

# CodePipelineを使うと何が嬉しい?
Web系のサービス等は開発および運用を並行して進める必要があるため、開発環境・ステージング環境・プロダクション環境のように異なる目的の環境を管理することでプロダクション環境の安定運用を目指すことが多いです。
しかしながら、これら複数の環境に対してDeployを実施する場合、CodeDeployのようなサービスにてDeployを自動化したとしても、それだけでは複数の環境へのDeploy自体は手作業が発生してしまいます。
そこで、CodePipelineを用いることで、従来手順書を作成して実施していた作業を自動的に実行できるようになります。

# Getting Startedに沿って WordPressのリリースプロセスをPipeline化してみよう
AWSのドキュメント [Simple Pipeline Walkthrough](http://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/getting-started-w.html)に沿って、WordPressのリリースプロセスのPipeline化を試してみます。
まずはじめに、CodePipelineを使用するためのIAMユーザを作成します。
IAMユーザの作成方法については、下記ドキュメントに従い、AWSCodePipelineFullAccess のポリシーをCodePipelineのIAMユーザにアタッチします。
[Setting Up AWS CodePipeline](http://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/setting-up.html)

## Step 1: Create an Amazon S3 Bucket for Your Application
Getting Startedでは、S3上に配置されたソースコードのアーカイブ(zip形式)をCodeDeployを用いてDeployする作業をPipeline化します。
Github上に用意されたサンプルアプリの代わりに、下記にて作成されたWordPressのアーカイブを使用します。
- [CodeDeploy Getting Started: WordPressをDeployしてみよう](http://qiita.com/rev4t/items/b4a542430c742c20f5f4)

注意点としては、S3バケットの存在するリージョンとCodeDeployのリージョンが同一である必要があります。また、CodePipelineが連携できるCodeDeployのリージョンは同一である必要があるため、CodeDeployについてもバージニア北部(us-east-1)を選択する必要があるのでご注意ください。
上記のドキュメントに従って作業された場合はバケットが作成済みのはずなので、アーカイブのS3へのコピーは不要です。

```
$ aws cp WordPressApp.zip s3://bucket-name/WordPressApp.zip
```
DataPipelineを使用する場合はS3バケットのVersioningが必須となるため、下記コマンドにて有効化します。
```
$ aws s3api put-bucket-versioning --bucket bucket-name --versioning-configuration Status=Enabled
```

## Step 2: Create AWS CodeDeploy Resources to Deploy the Sample Application
CodeDeployを用いてDeployを実施するため、CodeDeployのApplicationをあらかじめ作成しておきます。ここでは、WordPressのApplicationをあらかじめ前記の記事のような形で作成済みであることを前提にしているため、作業内容については省略します。
または、AWSのドキュメントに沿って Create Deployment Walkthrough wizardを用いたDemoを作成するとお手軽で良いと思います。

## Step 3: Create Your First Pipeline in AWS CodePipeline
1段目のPipelineを作成するために、CodePipelineのマネジメントコンソールにアクセスします。注意点としては、2015年10月現在ではCodePipelineが東京リージョンに対応していないため、バージニア北部(ap-northeast-1)等のリージョンにてサービスを利用する必要があります。

1. CodePipelineのマネジメントコンソールにアクセスします
2. Create Pipeline をクリックします
3. Step 1(Name)にてPipeline Nameに"MyFirstPipeline"を入力し、Next Stepへ進みます
4. Step 2(Source)に進むので、Source Providerに Amazon S3 を選択し、Amazon S3 Locationを入力します。入力形式は、s3://bucket-name/WordPressApp.zip のような形になります
5. Step 3(Build)に進み、Build ProviderとしてNo Buildを選択します。もしJenkensを利用している場合は、Jenkinsに接続するための情報を設定することができます
6. Step 4(Beta)に進み、Deployment ProviderとしてCodeDeployを選択します。Application NameおよびDeployment Groupでは、CodeDeployにて登録済みのものを入力します。
7. Step 5(Service Role)に進み、Role Nameを入力します。初めてCodePipelineを利用する場合はCodePipelineのService Roleが未登録のはずなので、"Create Role"ボタンを押して新たにService Roleを作成します。既にCodePipelineを利用したことがあればテキストボックスにてService Role名がリスト表示されるので、選択してNext Stepに進みます
8. Step 6(Review)に進み、設定内容を確認した上でCreate Pipelineボタンをクリックします

## Step 4: Add Another Stage to Your Pipeline
Production環境のPipelineを作成します。まず、2つ目のCodeDeploy Deployment Groupを作成します。
ただし、Getting Startedの手順では同一のインスタンスに対してDeployを実施するように設定することで、意図的にDeployを失敗させています。実際の環境では、異なるインスタンスにDeployするように設定しましょう。

```
aws deploy create-deployment-group \
  --application-name WordPress_App \
  --deployment-group-name WordPress_DepGroup2 \
  --deployment-config-name CodeDeployDefault.OneAtATime \
  --ec2-tag-filters Key=Name,Value=mytestfleet,Type=KEY_AND_VALUE \
  --service-role-arn arn:aws:iam::111111111111:role/codedeploy
```

```
aws deploy create-deployment \
  --application-name WordPress_App \
  --deployment-config-name CodeDeployDefault.OneAtATime \
  --deployment-group-name WordPress_DepGroup2 \
  --s3-location bucket=bucket-name,bundleType=zip,key=WordPressApp.zip
```

続いて、CodePipelineのマネジメントコンソールにアクセスし、Production環境のPipelineを追加します。

1. CodePipelineのマネジメントコンソールにアクセスします
2. Pipeline(MyFirstPipeline)を選択します
3. Editボタンをクリックし、Pipelineを編集します
4. Beta の下にある +Stage をクリックし、Beta Stage を追加します
5. Productionをテキストボックスに入力し、+Add Actionボタンをクリックします
6. Action categoryのドロップダウンリストからDeployを選択します。Action nameに Action-Second-Deployment を入力し、Deployment providerには CodeDeploy を選択します。Application nameに WordPress_App、Deployment GroupにWordPress_DepGroup2 を入力します。Input artifact #1 に MyApp を入力し、Add Actionボタンをクリックします
7. Save pipeline changesボタンをクリックし、編集した内容を保存します
8. Release changeボタンをクリックし、最後に実行されたrevisionを実行します
9. しばらく待つと、Production StageのDeployが失敗してFailedと表示されます。Deployが失敗する点については、意図した動作となります

## Step 5: Disable and Enable Transitions Between Stages in AWS CodePipeline
例えばProduction環境については自動でPipelineを遷移させることを抑止した上で動作確認するなど、Pipelineを全て自動で動かさないようにできます。

1. CodePipelineのマネジメントコンソールにアクセスし、MyFirstPipelineを選択します
2. Detail PageにてBeta StageおよびProduction Stageの間にある矢印をクリックします
3. 矢印をクリックすることでウィンドウが表示されるので、"Reason why you are disabling the transition:"のテキストボックスに適切な説明文を入力してDisableボタンをクリックします
4. アプリケーションのzipファイル再度アップロードします。S3のバケットはVersioningが有効になっているため、ファイルが更新されることで自動的にPipelineの動作が開始されます
5. Pipelineが自動的に開始されます。Production Stageへの遷移についてはdisableにしているため、Pipelineの動作はBeta Stageが成功したところで終了します
6. PipelineをProduction Stagemまで遷移させたい場合は、該当する矢印をクリックし、TransitionをEnableに変更します。

## Step 6: Clean Up Resources
Getting Startedにて作成されたリソースを削除します。作業の内容としては、はじめにCodePipeline(MyFirstPipeline)を削除します。つぎに、CodeDeployのApplicationを削除します。さいごに、インスタンスを削除します。