CodePipeline の承認アクションを調べてみた

こんにちは、藤本です。

先日、CodePipeline で承認プロセスを設けて本番環境へリリースする、というエントリし、CodePipeline の承認アクションについて触れました。その時はちゃんと調べずにただ使ってみただけだったのですが、ちょっと調べる機会があったので情報をまとめてみました。

CodePipeline と 承認アクション

CodePipeline はアプリケーションのリリースにおける様々なプロセスを繋げて自動化する継続的デリバリーサービスです。例えば、上記エントリに記載しているパイプラインは、CodeCommit へのプッシュをトリガーに、CodeBuild によりビルドや、ユニットテスト、CodeDeploy でビルドしたアプリケーションパッケージをインスタンスへデプロイすることができます。ただし、アプリケーションのデリバリにおいて、全てのプロセスを自動化できないケースも多々あります。そこで、CodePipeline では自動化できないプロセスを待機する承認アクションを提供しています。承認アクションを利用することで、自動化が難しい UIチェックやペネトレーションテスト、パフォーマンステストなどの手動テストを行うことができます。テスト結果に問題なければ承認することでリリースを継続し、テスト結果が NG であればリジェクトすることでリリースを中止することができます。自動処理が中断されても一つパイプラインとしてデリバリのプロセスをトラッキングできることも嬉しいです。

承認アクションの機能

承認アクションの機能はすごくシンプルです。機能は大きく 3つかと思っています。

  • デリバリの中断
  • 承認アクション時の SNS 通知
  • 承認と否認

デリバリの中断

CodePipeline は基本的にデリバリプロセスを繋ぎ、自動化します。そのため、デリバリプロセスにおける自動化できない、手動で行いたいテストや、レビュアーによるレビューなど CodePipeline ではできないことを実施したい時にデリバリを中断する必要があります。承認アクションをデリバリプロセスに挟むことで自動化されたパイプラインを中断することができます。

承認アクション時の SNS 通知

デリバリプロセスで承認アクションに差し掛かったタイミングで通知を行います。それにより承認者は承認・否認が必要なタイミングを知ることができます。また同時にデリバリしているアプリケーションの情報、承認・否認のURLなどの情報を受け取ることができます。通知方法は SNS なのでメール送信や、SMS によるテキストメッセージで受け取ることができたり、HTTP(S) リクエストで Webhook で SaaS を呼び出したり、AWS Lambda で任意の処理(Slack通知など)をできたりします。

通知内容

現在、CodePipeline の承認アクションでは SNS Topic の arn を除いてを下記 2つを設定可能です。SNS の通知にこれらが含まれます。

  • URL for review:通知受信者にレビューしてほしい URL(Webアプリケーション向け)
  • Comments:任意のコメント(リビジョン単位ではなく、パイプライン単位であることは注意)

AWS_CodePipeline_Management_Console

メール通知の場合、実際に受信するメールは以下のような感じです。

APPROVAL_NEEDED_Mail

↑で設定した情報が記載されています。

Approve or reject のリンクをクリックすることで CodePipeline の承認・否認画面に直接遷移することができます。(マネジメントコンソールにログイン済みであれば)

承認と否認

承認者はレビュー結果を持って、承認、否認することができます。承認することでデリバリプロセスを継続し、否認することでデリバリプロセスを中止します。承認・否認を行うには AWS マネジメントコンソール、もしくは awscli から実施することができます。

マネジメントコンソールからの承認・否認

コメントを記入して、承認(Approve)、否認(Reject)をクリックします。

AWS_CodePipeline_Management_Console 2

awscli からの承認・否認

承認トークンを取得して、承認API で承認(Approved)、否認(Rejected)を status で指定します。

$ aws codepipeline get-pipeline-state --name sampleapp
<<snip>>
        {
            "actionStates": [
                {
                    "actionName": "Approval",
                    "entityUrl": "https://dev.classmethod.jp/",
                    "latestExecution": {
                        "status": "InProgress",
                        "lastStatusChange": 1488718980.97,
                        "token": "9ca6c646-58a4-46b2-88a8-e7d0c99eb238"
                    }
                }
            ],
            "inboundTransitionState": {
                "enabled": true
            },
            "latestExecution": {
                "pipelineExecutionId": "8780e94e-7dfa-4be1-96c9-562a35cf6889",
                "status": "InProgress"
            },
            "stageName": "Approval"
        },
<<skip>>

$ aws codepipeline put-approval-result --pipeline-name sampleapp --stage-name Approval --action-name Approval --token 9ca6c646-58a4-46b2-88a8-e7d0c99eb238 --result status=Approved,summary=Good
{
    "approvedAt": 1489233979.072
}

まとめ

いかがでしたでしょうか? 承認アクションは地味な機能ですが、CodePipeline を扱う上では重要な機能だと思っています。CodePipeline は承認アクションで利用シーンが大きく広がります。

参考リンク