AWS CodePipelineのWalkthroughを試す

CodePipelineとはなんぞや？ということでとりあえず公式ドキュメントのWalkthroughを試してみたのでメモ

Walkthroughでは以下をやっています。

+ デプロイするアプリをS3に配置
+ CodeDeployを利用して対象EC2群にデプロイ
+ CodePipelineを利用してデプロイ
+ CodePipelineにステージを追加（失敗時の挙動を確認）
+ CodePipelineでステージ間の自動実行を停止させる

# 参考

+ [Simple Pipeline Walkthrough](http://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/getting-started-w.html)

# Step 1: Create an Amazon S3 Bucket for Your Application

デプロイするためのアプリをS3に配置します。

S3で新規にバケットを作成します。バケット名は任意でリージョンはUS-Standardとします。私は **toshihirock-codepipeline-test** というバケット名にしました。

次に作成したバケットのバージョニングを有効にします。
作成したバケットを選択し、Properties->Versioning->Enable Versioningと選択し、バケットのバージョニングを有効化します。

次にデプロイするためのアプリをGitHubからダウンロードします。

[awslabs/aws-codepipeline-s3-aws-codedeploy_linux](https://github.com/awslabs/aws-codepipeline-s3-aws-codedeploy_linux)

上記リンクに遷移後、右下の **Download ZIP** を選択してファイルをダウンロードします。

上記をそのままS3にアップロードするとうまく動作しないので一旦解凍してから再度ZIP圧縮します。

圧縮後、先ほど作成したバケット直下に作成したZIPファイルをアップロードします。

# Step 2: Create AWS CodeDeploy Resources to Deploy the Sample Application

CodeDeployでアプリケーションをデプロイします。

色々設定が面倒なので、サンプルアプリを利用します。

手動で色々設定する方法などは以前書きました。

[GitHubへのpush時にCodeDeployを使ってEC2にアプリケーションをデプロイする](http://qiita.com/toshihirock/items/4ab08afcab2a0e7628a8)


マネージメントコンソールでCodeDeployを選択し、Sample Deploymentを選択します。

次の画面ではデフォルトの状態でにLaunch Instancesを選択します。SSH鍵がない場合、作成して下さい。

![codepipeline-codedeploy-config.png](https://qiita-image-store.s3.amazonaws.com/0/20193/914d5b5c-9913-cd4f-c3f5-59bd6b9a44d8.png)


これでCloudFormationが実行され、EC2が3つ起動します。少し時間が掛かるので待ちます。終わったらNext Stepを選択します。

次にアプリケーション名を設定します。 **CodePipelineDemoApplication** と設定して NextStepを選択します。

リビジョンの設定では何も選択せず、NextStepを選択します。

デプロイメントグループの設定もデフォルトのままNextStepを選択します。

サービスロールの画面でCはCodeDeployで使うロールを設定します。作成していない場合、画面から作成できるの作成して下さい。

デプロイメントコンフィグレーションでは **All at Once** を選択し、NextStepを選択します。

最後にDeployNowを選択します。すると先ほどCloudFormationで作成されたEC2群にアプリケーションがデプロイされます。

EC2のPublicDNSにアクセスするとCodeDeployによってデプロイされたことが分かる画面の表示が確認できるかと思います。



# Step 3: Create Your First Pipeline in AWS CodePipeline

準備ができたのでCodePipelineを使ってみます。

マネージメントコンソールからCodePipelineを選択し、Get startedを選択します。

次にCodePipeline名称を記載します。 **MyFirstPipeline** としました。

次にソースコードの場所を指定します。SourceProviderとして現在GitHubとS3が選べるのですが、今回はS3を指定します。S3のlocationとしてはStep1でアップロードしたzipファイルのパスを指定します。私の例の場合 **s3://toshihirock-codepipeline-test/aws-codepipeline-s3-aws-codedeploy_linux-master.zip** を指定しました。

![Screen Shot 2015-07-21 at 11.10.34 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/86ec55ec-3bb4-f3c7-aff9-23d89cd925a9.png)


次にビルド方法を指定します。が、今回はただのHTMLでビルドの必要がないのでBuild providerで **No Build** を指定します。

次にBetaと表示される画面ではデプロイの方法を指定します。ここではStep2で作成したCodeDeployを利用するのでDeploymentProviderでは **AWS CodeDeploy** を指定します。Application nameでは **DemoApplication** , Deployment groupでは **DemoFleet**　を指定します。

次にCodePipelineで利用するロールを設定します。CodePipelineで利用したいロールがない場合、**cretate role** を選択して作成して下さい。

最後に全体のレビューを行い、問題なければ完了です。

作成完了後、CodePilelineが動作し始めるのでBetaが完了するまで待ちます。うまく動作すれば先ほど同様にEC2のPublicDNSにアクセスすると今度はStep1でS3にアップロードしたアプリケーションがデプロイされるため、表示されるHTMLが変わります。

![codepipeline-demo-success-message.png](https://qiita-image-store.s3.amazonaws.com/0/20193/dc0eb15b-bdbf-dd25-44a0-50a32e893b81.png)


# Step 4: Add Another Stage to Your Pipeline

本項では先ほど作成したCodePipelineに新しいステージを作成します。追加したステージの処理は失敗しますが、あくまで挙動確認ということで。

まず、起動したしたEC2の1台にタグを追加します。

+ Key->Type
+ Value->Production

次にマネージメントコンソールでCodeDeployを表示し、DeploymentGroupを追加します。先ほど作成した **DemoApplication** を選択します。次に **Create New Deployment Group** を選択し、以下のように設定します。

+ DeploymentGroupName->CodePipelineProductionFleet
+ Search by Tags(Key)->Type
+ Search by Tags(Value)->Production
+ Deployment Config->CodeDeployDefault.AllAtOnce
+ Service Role ARN->CodeDeploy用のロールのARN

次にマネージメントコンソールのCodePipelineで先ほど作成した **MyFirstPipeline** を選択します。

次に **Edit** を選択します。すると現在のPipelineの情報を変更できるようになりますので、一番下の **+Stage** となっている部分を選択します。するとステージの名前を入力できるようになるので **Production** という名称にします。次に名称を入力したすぐの **+action** を選択します。

するとActionを追加する画面になりますので以下のように設定します。

+ Action category->Deploy
+ Action name->Deploy-Second-Deployment
+ Deployment provider->AWS CodeDeploy
+ Application name->DemoApplication
+ Deployment group->CodePipelineProductionFleet
+ Input artifact #1->MyApp

![Screen Shot 2015-07-21 at 10.32.16 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/4150444d-1c85-b3db-a908-cf9c50fc923a.png)


最後に **Save pipeline changes** を選択して追加した内容を反映させます。

これで新しいProductionというステージが追加することが出来ました。ただし、ソースのS3自体の更新が行われたわけではないのでこのタイミングではPipelineは実行されません。挙動を確認したい場合、 **Release chage** を選択して、現在のS3のリビジョンで再度Pipelineを実行する事ができます。

ただし、最初に記載したように現在の設定だとProductionステージが失敗となります。ログなどは確認が可能です。

# Step 5: Disable and Enable Transitions Between Stages in AWS CodePipeline

現在、全てのステージは自動で順番に実行されますが、ものによっては手動で確認し、その後、次のステージの作業を実行してほしいこともあるかと思います。

CodePipelineではステージとステージの間を自動で実施しないようにすることができます。先ほど作成したMyFirstPipelienでやってみます。

例えばBetaとProductionのステージの間に手動確認を入れたい場合、BetaとProductionの間の↓（矢印アイコン）を指定します。すると自動で実行しない理由を書くことが出来ます。今回の例では **Disabling transition while I troubleshoot the failure** と記載しました。（日本語で入力したらダメでした）

Disableにするとその旨を示す表示になり、詳細もあとで確認できます。

![Screen Shot 2015-07-21 at 10.24.17 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20193/ba49fac4-47d3-c089-ac63-4a65f3d51cbb.png)


この状態でRelease changeの実行によってPipelineを実行した場合、想定したどおり、Betaまでの動作で終わってProductionは自動で実行されません。実行できる状態になったら、設定をenableにすると実行されます。

# Step 6: Clean Up Resources

最後に使ったものを削除します。

+ CodePipeline->MyFirstPipelineを削除
+ CodeDeploy->DemoAppliactionを削除
+ CloudFormation->CodeDeployのサンプルアプリ作成時に追加されたリソース(EC2など）を削除