michimani.net

AWS CodePipeline のパイプライン実行を停止できるようになったので CLI で試してみた

2020-01-22

AWS CodePipeline で実行中のパイプラインを停止できるようになったので、実際に試してみました。

目次

概要

上記 AWS 公式のお知らせにもあるように、 AWS CodePipeline で実行中のパイプラインを、コンソールおよび SDK から停止できるようになりました。
お知らせの概要は下記の通りです。

CodePipile で実行中のパイプラインを簡単に停止できるようになりました。これまでは下記のいずれかの方法しかありませんでした。

本日より、 CodePipeline コンソールおよび AWS CodePipeline SDK を使用してパイプラインの実行を停止することができるようになりました。

ということで、実際に試してみます。

やってみる

CodePipeline コンソールと SDK によって停止できるということですが、コンソールからの停止については既にクラメソさんのブログで紹介されていたので、ここでは割愛します。

なので、今回はもう一方の方法である SDK で…と思ったのですが、最新の AWS CLI でも停止が可能なので、そちらで試してみます。

AWS CLI で停止してみる

使用までに AWS CLI をアップデートしたところ、バージョンは 1.17.7 でした。

❯ aws --version
aws-cli/1.17.7 Python/3.7.5 Darwin/18.7.0 botocore/1.14.7

停止に使用するコマンドは aws codepipeline stop-pipeline-execution です。

必須のパラメータは --pipeline-name--pipeline-execution-id です。
コンソール上で停止する際の選択肢として 停止して待機停止して中止 がありますが、それぞれ --abandon--no-abandon のオプションで指定します。デフォルトは --abandon が有効になっています。(つまり、 停止して中止)

今回は、このブログの CI/CD に使っている michimani.net-pipeline という名前のパイプラインを対象にします。

パイプラインを開始する

❯ aws codepipeline start-pipeline-execution --name michimani.net-pipeline
{
    "pipelineExecutionId": "e2d0a696-4151-49be-9b40-73a088619c1c"
}

パイプラインを停止する

❯ aws codepipeline stop-pipeline-execution --pipeline-name michimani.net-pipeline \
--pipeline-execution-id e2d0a696-4151-49be-9b40-73a088619c1c
{
    "pipelineExecutionId": "e2d0a696-4151-49be-9b40-73a088619c1c"
}

停止実行後のステータス確認

❯ aws codepipeline list-pipeline-executions --pipeline-name michimani.net-pipeline --max-items 1 | jq .pipelineExecutionSummaries
[
  {
    "pipelineExecutionId": "e2d0a696-4151-49be-9b40-73a088619c1c",
    "status": "Stopped",
    "startTime": 1579698780.514,
    "lastUpdateTime": 1579698888.742,
    "sourceRevisions": [
      {
        "actionName": "Source",
        "revisionId": "1234567890",
        "revisionSummary": "add enable inner adsense parameter",
        "revisionUrl": "https://github.com/michimani/michimani.net/commit/1234567890"
      }
    ],
    "trigger": {
      "triggerType": "StartPipelineExecution",
      "triggerDetail": "arn:aws:iam::12345678:user/hoge"
    }
  }
]

ちなみに --no-abandon オプションを指定した場合は、しばらくしてから Stopped になりました。


停止して待機 なのか 停止して中止 なのかは下記のコマンドで確認できます。

aws codepipeline get-pipeline-state --name michimani.net-pipeline

現在のパイプラインのステータスを取得できるので、該当のアクションの actionStates.latestExecution.statuslatestExecution.status の値で確認することができます。

--no-abandon オプションを指定した場合 (停止して待機 の場合) は、進行中のアクションを実行してからパイプラインを停止するので actionStates.latestExecution.statusSucceeded (もしくは失敗していれば Failed) 、 latestExecution.statusStopped になっています。

一方で、オプションを指定しない または --abandon オプションを指定した場合 (停止して中止 の場合) は、進行中のアクションを待たずにパイプラインを停止するので、 actionStates.latestExecution.statusAbandonedlatestExecution.statusStopped になっています。
また、 停止して中止 の場合は、コンソール上で赤字で Abandoned と表示されます。

CodePipeline Abandoned

実行中のパイプラインの を取得するには

今回はパイプラインの開始も CLI で実行したため、パイプラインの実行 ID は開始コマンド実行時に確認できましたが、すでに実行中のパイプラインの実行 ID = pipelineExecutionId を取得するには下記のコマンドを実行します。

aws codepipeline list-pipeline-executions --pipeline-name michimani.net-pipeline \
| jq .pipelineExecutionSummaries \
| jq 'map(select(.status == "InProgress"))' \
| jq '.[].pipelineExecutionId'

これで実行中 (= ステータスが InProgress) のパイプラインの pipelineExecutionId を取得できます。

まとめ

AWS CodePipeline で実行中のパイプラインを停止できるようになったので、実際に AWS CLI で試してみた話でした。
これまで CodePipeline でパイプラインが開始されると、実行中に止めたくなっても新たに優先されるパイプラインを開始したり、実行中のパイプラインがタイムアウトするまで待つ必要がありました。
今回のアップデートで即座に停止 (中止) することができるようになったので、そういう状態の時に待つ必要がなくなり、時間が節約できますね。


comments powered by Disqus