CloudFormationでCICDを構築する
はじめに
CFnテンプレートをゼロから書くのは大変だし、どのリソースが必要なのか忘れちゃうので備忘録を作りました。
ChatGPTちゃんにお願いすればシンプルなテンプレートくらいは作ってくれそうですが、自分が理解できていないことについてAIに丸投げすると大変なことになるので。
AWS::CodeCommit::Repository
特別必要な設定はない
AWS::S3::Bucket
Pipeline間のArtifactsのやり取りに用いる
AccessControlはPrivate、PublicAccessBlockは全てtrueで問題ない
AWS::CodeBuild::Project
自動化したい細かい作業があれば利用する
基本的にはイメージのビルドとECRリポジトリへのプッシュなど
Artifacts:TypeはCODEPIPELINE固定
Environment:ComputeTypeは基本的にBUILD_GENERAL1_SMALL(無料利用枠)
Environment:Imageは新しいの使っとけばいいと思う
使っているパッケージと互換性が無いとか言われたら変える
AWS::CodePipeline::Pipeline
本体
ArtifactStoreでバケットを指定する
StagesにActionsを定義していく
Actions:ActionTypeId:ProviderがActionの主体(CodeBuildとかCloudFormationとか)
ProviderがCloudFormationの場合
変更セットを作成(CHANGE_SET_REPLACE)→変更セットを実行(CHANGE_SET_EXECUTE) の段取りを踏む
明示的に命名したIAMロールを作る
CFnでデプロイするリソースの中にIAMロールがあり、かつそのロールに想定通りの命名をしたい場合、変更セットの作成時にActions:Configuration:CapabilitiesでCAPABILITY_AUTO_EXPAND,CAPABILITY_NAMED_IAMを指定する必要がある
各リソースのPolicyで許可するロールを定めやすくなる
CFnテンプレートの上書き
ができる
この機能のお陰で、デプロイしたいリソースのプロパティを柔軟に設定できる すき
-
Configuration:TemplateConfigurationでjsonファイルを指定すると、jsonファイルに記述したパラメータをCFnテンプレートに流し込める- jsonファイルとCFnテンプレートのパラメータに不一致があるとエラー吐くので注意
-
Configuration:ParameterOverridesでjson文字列を流し込めば、jsonファイル外からもパラメータを流し込める- Pipelineの他のActionから受け取ったArtifactsを流し込みたいときに使える
CodePipeline用IAMロール
- Artifactsを管理するS3バケットへのアクセス権限
- ソース管理用CodeCommitリポジトリへのアクセス権限
- CFn用のIAMロールを作成するための
iam:CreateRoleとiam:PassRole - CodeBuildを実行するための
codebuild:BatchGetBuildsとcodebuild:StartBuild
CodeBuild用IAMロール
buildspec.yaml内で触っているリソースへのアクセス権限
CloudFormation用IAMロール
ProviderとしてのCFnが作成するリソースたちへのアクセス権限
Create系だけじゃなくてUpdateやDelete系もつけないと削除時に困る
(CFnで作成されたStack内のリソースは、そのStackを作成したIAMロールで操作されるから)
おわりに
CodePipelineとかCodeCommitとか、CI/CD系をまとめて何と呼ぶのが一般的なんでしょうか
僕はCodeSuiteって呼びたい
だってURLにcodesuiteって入ってるもん
Discussion