はじめに
以前の記事で、クロスアカウントなパイプラインを実行するコツをまとめてみた。
今回は、さらにこの2つのイベント連携部分をクロスリージョンにするにはどうしたら良いかを考えた。
最初に結論を書いておくと、CodePipelineのクロスリージョンアクションを使うのが良い、ということだ。
【AWS公式】CodePipeline でクロスリージョンアクションを追加する
検討経緯
以下の記事を参考にして、CodePipelineの完了時にS3にファイルを突っ込んでトリガしたり、サービス側アカウントにSNSトピックを置いて、CodePipelineの完了時にビルドアカウント側からPublishしてリージョン跨ぎのLambdaを起動したりした。
【参考】【Developers.IO】S3 Event Notificationを別アカウントのリージョンの異なるAmazon SNSに送信し、Lambdaを発火させる
多少強引ではあるが、これなら別リージョンのCodePipelineに着火することはできそうだった。
だがしかし、結局はCodePipelineのソースステージがクロスリージョン対応していなくて、別リージョンのCodeCommitを参照できないので、どうにもならなかった。S3でソース連携とか、あまりに泥臭すぎる。
素直にCodePipelineとソースステージは同一リージョンに置いて、ビルド・デプロイステージをクロスリージョンアクションを使うのが良いだろう。
クロスリージョンアクションのためのIaC(Terraform)
マネージメントコンソールでの実施方法はAWS公式にもあるので、ここではTerraformの書き方を残しておく。
と言っても、そんなに難しいことではない。
以下のように、2つのリージョンのアーティファクトストアを用意して、★の箇所にregion
のプロパティを設定すれば良い。このケースでは、以前の記事のビルド側アカウントをap-northeast-1
、サービス側アカウントのクロスリージョン対応をus-east-2
で行っている例だ。S3はグローバルサービスのはずなのに、クロスリージョンで動かす先のリージョンに作っておかなければいけないという制約は謎……。
resource "aws_codepipeline" "service_account" {
:
(中略)
:
artifact_store {
region = "ap-northeast-1" ★
type = "S3"
location = aws_s3_bucket.service_artifact1.bucket
encryption_key {
id = aws_kms_key.cross_account.arn
type = "KMS"
}
}
artifact_store {
region = "us-east-2" ★
type = "S3"
location = aws_s3_bucket.service_artifact2.bucket
}
:
(中略)
:
stage {
name = "Build"
action {
run_order = 2
name = "Build"
category = "Build"
owner = "AWS"
provider = "CodeBuild"
version = "1"
input_artifacts = ["SourceArtifact"]
output_artifacts = ["BuildArtifact"]
region = "us-east-2" ★
configuration = {
ProjectName = aws_codebuild_project.service_account.name
}
}