📝

CloudFormationでCICDを構築する

2023/05/16に公開

はじめに

CFnテンプレートをゼロから書くのは大変だし、どのリソースが必要なのか忘れちゃうので備忘録を作りました。
ChatGPTちゃんにお願いすればシンプルなテンプレートくらいは作ってくれそうですが、自分が理解できていないことについてAIに丸投げすると大変なことになるので。

AWS::CodeCommit::Repository

特別必要な設定はない

AWS::S3::Bucket

Pipeline間のArtifactsのやり取りに用いる
AccessControlPrivatePublicAccessBlockは全てtrueで問題ない

AWS::CodeBuild::Project

自動化したい細かい作業があれば利用する
基本的にはイメージのビルドとECRリポジトリへのプッシュなど
Artifacts:TypeCODEPIPELINE固定
Environment:ComputeTypeは基本的にBUILD_GENERAL1_SMALL(無料利用枠)
Environment:Imageは新しいの使っとけばいいと思う
使っているパッケージと互換性が無いとか言われたら変える

AWS::CodePipeline::Pipeline

本体
ArtifactStoreでバケットを指定する
StagesActionsを定義していく
Actions:ActionTypeId:ProviderがActionの主体(CodeBuildとかCloudFormationとか)

ProviderがCloudFormationの場合

変更セットを作成(CHANGE_SET_REPLACE)→変更セットを実行(CHANGE_SET_EXECUTE) の段取りを踏む

明示的に命名したIAMロールを作る

CFnでデプロイするリソースの中にIAMロールがあり、かつそのロールに想定通りの命名をしたい場合、変更セットの作成時にActions:Configuration:CapabilitiesCAPABILITY_AUTO_EXPAND,CAPABILITY_NAMED_IAMを指定する必要がある
各リソースのPolicyで許可するロールを定めやすくなる

CFnテンプレートの上書き

ができる
この機能のお陰で、デプロイしたいリソースのプロパティを柔軟に設定できる すき

  1. Configuration:TemplateConfigurationでjsonファイルを指定すると、jsonファイルに記述したパラメータをCFnテンプレートに流し込める
    • jsonファイルとCFnテンプレートのパラメータに不一致があるとエラー吐くので注意
  2. Configuration:ParameterOverridesでjson文字列を流し込めば、jsonファイル外からもパラメータを流し込める
    • Pipelineの他のActionから受け取ったArtifactsを流し込みたいときに使える

CodePipeline用IAMロール

  • Artifactsを管理するS3バケットへのアクセス権限
  • ソース管理用CodeCommitリポジトリへのアクセス権限
  • CFn用のIAMロールを作成するためのiam:CreateRoleiam:PassRole
  • CodeBuildを実行するためのcodebuild:BatchGetBuildscodebuild:StartBuild

CodeBuild用IAMロール

buildspec.yaml内で触っているリソースへのアクセス権限

CloudFormation用IAMロール

ProviderとしてのCFnが作成するリソースたちへのアクセス権限
Create系だけじゃなくてUpdateやDelete系もつけないと削除時に困る
(CFnで作成されたStack内のリソースは、そのStackを作成したIAMロールで操作されるから)

おわりに

CodePipelineとかCodeCommitとか、CI/CD系をまとめて何と呼ぶのが一般的なんでしょうか
僕はCodeSuiteって呼びたい
だってURLにcodesuiteって入ってるもん

Discussion