困っていた内容
構築済みの 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」を参照してください。