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