イフブロ

イフブロ

インフラエンジニアのブログ

AWS CDK と Organization StacksetsのCI/CD パイプライン

AWS CDKのCI/CDなどを考えたそのメモです。

やりたかった事:

  • AWS CDKを使ってCloudFormation Templateを作成してOrganization StackSetsを登録・更新が出来る様になりたかった

  • TerraformでもCFnを扱う事もできるが、まだTerraformではOrg StackSetsは扱えない

  • CRUDを自前で実装するのは嫌だな。Terraformいきたいなぁと思うけど、一旦忘れる。後で考える。

  • CI/CDパイプラインは必要

そうする事で、CI/CDを通じてCDK -> CFn Templateの作成 -> Diff Check -> Approve -> Apply みたいなPipelineをしたかった。as a Codeで。

しかし、CDKのDeployではAWS Organization StackSetsのManaged RoleによるOUや組織全体へのDeployは2020年1月3日時点ではサポートされていなかった。

さぁどうする。がスタート地点である。

まずCDKでsynthする所までは公式document通りなので特に書かない。

CI (Diff Check)

基本はdeployが使えないので、標準のDiffそのままでは使えない。 (または、ダミーのAWSアカウントに対してDeployしてDiffCheckするしかない) 今回はダミーのAWSアカウントを作らない方法。

初回についてはまだ考慮してないが - 前回適用したcdk.outのフォルダが残っている という前提を満たす場合に以下のコマンドを使う事で、実際にdeployしておかなくてもcdkのdiffをとることができる。

> cdk diff AwsOrganizationCfnCdkStack --template ./cdk.old/AwsOrganizationCfnCdkStack*

f:id:umisora2:20210103113327p:plain
cdk diff 結果

cdk diff の optionに --template パラメーターがあり、それで前回のtemplateファイル(*1)を指定するとAWSのCredentialを使わなくてもDiffをとる事ができた。 実際にCDKのdiffのロジックを見に行くとAWSの現在のリソースとの比較は行っておらず、あくまでtemplate同士の比較っぽかったのでこれで動くのだろう。 driftが発生していない前提ならこれで十分。

(※1) これはフォルダ指定では上手く動かなかったので具体的なStack.jsonを指定する必要がある。なので cdk ls した結果をeachして1つづつチェックするのが良さそう。

CD

では synth した結果をGithub上でレビューしてOKだったとするとコードはOKなので、そのままDeployプロセスに入る。

Organization StackSetsのデプロイ方法は * s3ファイルを手動で更新する * AWS CLIを通じて更新する の2パターンができそうだった。

CLIについてはこちらを参照。 スタックセットの更新 - AWS CloudFormation

CLIを通じてやる場合もテンプレートをテキストでCLIに渡すか、S3のPathを渡す方法がある。 update-stack — AWS CLI 1.18.207 Command Reference

テンプレート自体は * 手動で画面からStackSets作るときにアップロード * Parameter BodyでTEXTを渡す * S3にPushする

の3パターンある。 ファイルサイズに制限があるのでS3 Pushを選択するのが良さそうだ。

the template body with a minimum length of 1 byte and a maximum length of 51,200 bytes.

これでCDの骨子が出来た。流れはこうなりそう (Diff Checkが終わっている前提とする) * cdk synthで出力したcdk.outをs3にpushする * aws cliでupdate stacksetsを実行する (Org StackSetsも対応している)

まとめ

Terraformでは出来ないが、CFnがあれば出来る事も多い。

新規作成と削除とは未だ考えていない。CLIではOrgStackSetsも出来そうなのでStack自体が新規かどうか?を判断したうえで * Diffの取得方法 * Apply方法の切替 ができれば良さそう。