CodePipeline でポーリングパイプラインの一覧を取得する方法を教えてください

2023.05.15

困っていた内容

構築済みの CodePipeline で変更の検出方法をポーリングからイベントに変更することを検討しています。
パイプラインが大量にあるので、まずはポーリングを使用しているパイプライン(ポーリングパイプライン)の一覧を作成したいです。方法を教えてください。

どう対応すればいいの?

次の AWS 公式ドキュメントで紹介されているスクリプトを実行してください。

ポーリングパイプラインを移行してイベントベースの変更検出を使用する - AWS CodePipeline

アカウントのポーリングパイプラインを表示する (スクリプト)

上記で紹介されているスクリプトを実行すると、ポーリングを使用しているパイプライン名と、最終の実行時間の一覧が取得できます。
AWS CLI と AWS SDK(Boto3)の2種類が提供されているので、環境にあわせてお好きな方を選択してください。

実行例

# ./pollingPipelineExtractor.sh us-west-2

| Polling Pipeline Name | Last Executed Time           |
| _____________________ | __________________           |
| myCodeBuildPipeline   | Wed Mar 8 09:35:49 PST 2023  |
| myCodeCommitPipeline  | Mon Apr 24 22:32:32 PDT 2023 |
| TestPipeline          | Not executed in last year    |

Saving list of polling pipeline names to us-west-2-1682496174.csv...%

やってみた

今回は AWS CLI のスクリプトを使用します。
エディタを開き、次のスクリプトを作成します。

PollingPipelinesExtractor.sh

#!/bin/bash

set +x

POLLING_PIPELINES=()
LAST_EXECUTED_DATES=()
NEXT_TOKEN=null
HAS_NEXT_TOKEN=true
if [[ $# -eq 0 ]] ; then
    echo 'Please provide region name'
    exit 0
fi
REGION=$1


while [ "$HAS_NEXT_TOKEN" != "false" ]; do
    if [ "$NEXT_TOKEN" != "null" ];
        then
            LIST_PIPELINES_RESPONSE=$(aws codepipeline list-pipelines --region $REGION --next-token $NEXT_TOKEN)
        else
            LIST_PIPELINES_RESPONSE=$(aws codepipeline list-pipelines --region $REGION)
    fi
    LIST_PIPELINES=$(jq -r '.pipelines[].name' <<< "$LIST_PIPELINES_RESPONSE")
    NEXT_TOKEN=$(jq -r '.nextToken' <<< "$LIST_PIPELINES_RESPONSE")
    if [ "$NEXT_TOKEN" == "null" ];
        then
            HAS_NEXT_TOKEN=false
    fi

    for pipline_name in $LIST_PIPELINES
    do
        PIPELINE=$(aws codepipeline get-pipeline --name $pipline_name --region $REGION)
        HAS_POLLABLE_ACTIONS=$(jq '.pipeline.stages[].actions[] | select(.actionTypeId.category == "Source") | select(.actionTypeId.owner == ("ThirdParty","AWS")) | select(.actionTypeId.provider == ("GitHub","S3","CodeCommit")) | select(.configuration.PollForSourceChanges == ("true",null))' <<< "$PIPELINE")
        if [ ! -z "$HAS_POLLABLE_ACTIONS" ];
        then
            POLLING_PIPELINES+=("$pipline_name")
            PIPELINE_EXECUTIONS=$(aws codepipeline list-pipeline-executions --pipeline-name $pipline_name --region $REGION)
            LAST_EXECUTION=$(jq -r '.pipelineExecutionSummaries[0]' <<< "$PIPELINE_EXECUTIONS")
            if [ "$LAST_EXECUTION" != "null" ];
                then
                    LAST_EXECUTED_TIMESTAMP=$(jq -r '.startTime' <<< "$LAST_EXECUTION")
                    LAST_EXECUTED_DATE="$(date -r ${LAST_EXECUTED_TIMESTAMP%.*})"
                else
                    LAST_EXECUTED_DATE="Not executed in last year"
            fi
            LAST_EXECUTED_DATES+=("$LAST_EXECUTED_DATE")
        fi
    done

done

fileName=$REGION-$(date +%s)
printf "| %-30s | %-30s |\n" "Polling Pipeline Name" "Last Executed Time"
printf "| %-30s | %-30s |\n" "_____________________" "__________________"
for i in "${!POLLING_PIPELINES[@]}"; do
  printf "| %-30s | %-30s |\n" "${POLLING_PIPELINES[i]}" "${LAST_EXECUTED_DATES[i]}"
  printf "${POLLING_PIPELINES[i]}," >> $fileName.csv
done

printf "\nSaving Polling Pipeline Names to file $fileName.csv."

作成したスクリプトを実行すると、パイプライン名と実行日時が表示されます。
※リージョン(ap-northeast-1)は必要に応じて修正してください。

コマンド例

$ bash ./PollingPipelinesExtractor.sh ap-northeast-1
| Polling Pipeline Name          | Last Executed Time             |
| _____________________          | __________________             |
| Polling-test-codepipeline      | 2023年 5月12日 金曜日 10時15分00秒 JST |

Saving Polling Pipeline Names to file ap-northeast-1-123456789.csv.%

補足

AWS CLI のバージョン 2 がインストールされた環境で実行した場合、タイムスタンプの自動表記に伴い時刻処理でエラーが発生する場合があります。
エラーが発生した場合は、AWS SDK(Boto3)のご利用や、AWS CLI のconfigファイルに次の値を追加してください。

.aws/config

cli_timestamp_format=wire

AWS CLI バージョン 2 の新機能と変更点 - AWS Command Line Interface

AWS CLI バージョン 2 はデフォルトで、すべてのタイムスタンプレスポンス値を ISO 8601 形式で返します。AWS CLI バージョン 1 では、コマンドによって返されるタイムスタンプ値が HTTP API レスポンスによって返された値の形式になっており、これはサービスによって異なる可能性がありました。

HTTP API レスポンスから返された形式でタイムスタンプを表示するには、config ファイルで値 wire を使用します。詳細については、「cli_timestamp_format」を参照してください。

参考資料