ECRへのプッシュをトリガーにpipeline回したいけど、なんでかわからん、って話があって、下記の手順で検証してみます。
- ECRにレポジトリ作る
- CodePipelineのSourseをECRにする
- (その他も設定)
- ECRにイメージをpush
- Pipeline回らない
ほー。確かに。
検証内容
Source
ECR push
$ $(aws ecr get-login --no-include-email --region ap-northeast-1)
$ docker build -t otafuku .
$ docker tag otafuku:latest 1234567890.dkr.ecr.ap-northeast-1.amazonaws.com/otafuku:latest
$ docker push 1234567890.dkr.ecr.ap-northeast-1.amazonaws.com/otafuku:latest
pushできてる
回らない
(※失敗してるのは単にイメージpush前だったからで、今回はpushしても回っていないという事象)
なぜだろう?
どうやらECRにpushされた時にはCloudTrailで PushImage ってイベントがキャッチされてCloudWatch Ruleからpipelineがキックされるらしい。
push -> CloudTrail -> cloudWatchRule -> pipeline
Ruleはcodepipelineを作った時に作成されてる。今回の場合はこんな感じ。
試しにターゲットにSNSを追加してみたりしつつ検証してみる
しかし・・
・・う、動かない。メールも飛ばない
そして判明?!
CloudWatch Ruleのカスタムイベントパターンの構築で、ECRソースのECR Image Actionってのを選びつつ、自分で項目埋めてみたところ機能しました。(判明まで半日かかった。。)
解決!
ちなみにイベントはこんな感じで飛んでくるらしい
{
"account": "123456789012",
"detail": {
"action-type": "PUSH",
"image-digest": "sha256:f98d67af8e53a536502bfc600de3266556b06ed635a32d60aa7a5fe6d7e609d7",
"image-tag": "latest",
"repository-name": "ubuntu",
"result": "success"
},
"detail-type": "ECR Image Action",
"id": "4f5ec4d5-4de4-7aad-a046-56d5cfe1df0e",
"region": "us-east-1",
"resources": [],
"source": "aws.ecr",
"time": "2019-08-06T00:58:09Z",
"version": "0"
}
それをこんな感じで拾う
{
"source": [
"aws.ecr"
],
"detail-type": [
"ECR Image Action"
],
"detail": {
"action-type": [
"PUSH"
],
"image-tag": [
"latest"
],
"repository-name": [
"ubuntu"
]
}
}
#余談
これ、関係あるんじゃないかなぁ。
Amazon Elastic Container Registry での EventBridge サポート
なんか今回に絡むあたりがアップデートされてる。codepipeline構築時に作られるイベントに影響でちゃってるとか??