CodePipeline で承認プロセスを設けて本番環境へリリースする #reinvent

おはようございます、藤本です。

先日、AWS re:Invent 2016 でリリースされた CodeBuild を CodeCommit、CodeDeploy、CodeCommit と組み合わせて、デリバリプロセスの自動化を試してみました。

こちらは master ブランチにプッシュしたら、テスト、ビルドを通して、インスタンスにアプリケーションをデプロイします。リポジトリへプッシュするだけでデプロイまで全て自動化されていて、デプロイが簡単ですね。ただし、テストが全て自動で網羅されていることが前提となっています。

ユニットテスト、単一アプリケーション内のインテグレーションテストであれば、ある程度できるかもしれませんが、ペネトレーションテスト、他システムとの統合テスト、負荷テスト、UIチェックなど全てのテストを自動化できているケースはまだまだ少ないのではないでしょうか?

今回は、前回の続きじゃないですが、master ブランチにプッシュしたら、自動でデプロイされるのはステージング環境とし、ステージング環境で自動化できないテストを実施した上で、承認プロセスを設けて、本番環境へリリースするパイプラインを試してみました。

リリースプロセス(現実案)

概要

先日は CodePipeline の Source(CodeCommit)、Build(CodeBuild)、Deploy(CodeDeploy)をご紹介しましたが、他には Test、Invoke、Approval というアクションカテゴリがあります。今回は Approval という任意のタイミングで処理を続行するアクションを利用して、承認プロセスを設けてみました。

前回の環境を利用します。リポジトリへのプッシュからインスタンスへのデプロイまでの処理は変わりません。デプロイ先がステージング環境だとお考えください。

AWSでのデプロイ(3)

こちらの詳細については下記エントリをご参照ください。

今回のデリバリの流れは以下のようになります。

AWSでのデプロイ(承認プロセス)

ポイントとしては以下となります。

  • ステージングデプロイから本番デプロイの間に自動化できないテストを実施
    • 本番デプロイは任意のタイミングで実施
  • リポジトリのコミットから本番リリースまで追いかけたい
    • CodePipeline の可視化されたパイプラインで処理状況を追うことが可能
  • 本番デプロイはステージング環境でテストしたパッケージと同じものを利用したい
    • CodeDeploy でシステマチックにパッケージを選択
    • 注意点として、今回の構成では本番デプロイ前に master ブランチへプッシュすると、新しくプッシュされたパッケージが配布されます。ただ、アーティファクトを分けるなど対策は可能です。

試してみた

前回の CodeCommit、CodeBuild、CodeDeploy、CodePipeline の設定を流用します。前回の設定は完了しているところから始めます。

目次

Step 1 : 承認用 SNS Topic の作成

承認プロセス(CodePipeline の Approval)になると SNS Topic への Publish します。

SNS の設定画面から Topic を作成します。

AWS_SNS

Topic 名、表示名を入力します。

AWS_SNS 2

SNS Topic は準備完了です。

Step 2 : 本番用 Deployment Group の追加

前回は CodeDeploy のアプリケーションに一つの Deployment Group しか用意しませんでした。本番用の Deployment Group を作成します。

AWS_CodeDeploy_Management 3

本番用の Deployment Group が作成されました。

AWS_CodeDeploy_Management 4

<

h3 id="step3">Step 3 : CodePipeline の設定追加 前回作成した CodePipeline のパイプラインに承認、および本番環境へのデプロイを追加します。

前回作成したパイプラインはこちらです。

AWS_CodePipeline_Management_Console 9

パイプラインを編集します。

Stage を追加します。

AWS_CodePipeline_Management_Console 3

まずは、承認アクションを追加します。

AWS_CodePipeline_Management_Console 5

項目 説明
Action category 今回は承認プロセスを利用したいので Approval を選択
Action name 任意の名前
Approval type Manual approval(現在は一択)
SNS topic ARN Step 1 で作成した SNS Topic の ARNを選択
URL for review パイプラインのレビュー用リンクに埋め込む URL
Comments 表示するコメント

次に、本番環境へのデプロイアクションを追加します。

AWS_CodePipeline_Management_Console 7

項目 説明
Deployment provider 今回は CodeDeplooy を利用するため、CodeDeploy を選択
Application name CodeDeploy のアプリケーション名を選択
Deployment group Step 2 で作成したデプロイメントグループ名を選択

save pipeline changes をクリックして設定を反映します。

AWS_CodePipeline_Management_Console 8

作成したパイプラインはこんな感じです。

AWS_CodePipeline_Management_Console 11

Step 4 : 動作確認(リリース承認)

それでは、ソースコードをプッシュして、動作確認してみましょう。

$ git commit -am "approval test"
[master bc50ff3] approval test
 1 file changed, 1 insertion(+), 2 deletions(-)

$ git push origin master
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 442 bytes | 0 bytes/s, done.
Total 5 (delta 4), reused 0 (delta 0)
remote:
To https://git-codecommit.us-east-1.amazonaws.com/v1/repos/django-fujimoto
   e109fd6..bc50ff3  master -> master

ステージング環境へのデプロイまでSucceededとなり、承認の前でパイプラインが停止しました。

AWS_CodePipeline_Management_Console 12

ここから最初のプロセスに記載したリリースに向けたテストやら、リリース判定を迎えます。

無事にリリースを承認されたら、本番環境へリリースします。リリースを開始する時は Review をクリックします。コメントを入力し、Approval をクリックします。

AWS_CodePipeline_Management_Console 13

パイプラインの後続処理が開始されました。

AWS_CodePipeline_Management_Console 14

本番デプロイまで完了すると、全てSucceededステータスになりました。

AWS_CodePipeline_Management_Console のコピー

リリースプロセスがどこまで進んでいるのかがひと目見て分かるのは嬉しいですね。

Step 4 : 動作確認(リリース否認)

次に、リリースの否認を試してみましょう。ソースコードをプッシュして、動作確認してみましょう。

ステージング環境へのデプロイまでSucceededとなり、承認の前でパイプラインが停止しました。

AWS_CodePipeline_Management_Console_15

リリースに向けたテストでバグが見つかったり、リリース判定の材料が足りずに、NG 判定となった場合、パイプラインの承認プロセスで否認することで中断するができます。

中断する時は Review をクリックします。コメントを入力し、Reject をクリックします。

AWS_CodePipeline_Management_Console 16

Rejectedステータスとなり、ProductionDeploy は実施されませんでした。

AWS_CodePipeline_Management_Console_18

まとめ

いかがでしたでしょうか?

CodePipeline は全てが自動化されたリリースプロセスだけでなく、手動で作業するところも、Approval を埋め込むことで待ちのステータスとすることができます。リリースプロセスを可視化することで関係者が増えてもパイプラインのステータスで管理するのは良さそうです。