やりたいこと(今回の具体例)
CloudFormationで構築しているCodePipelineワークフローがあります。
このワークフローのデプロイステージは「ChangeSet生成」と「ChangeSet実行」アクションを実行をしています。
これに対して「EnableManualApproval」という名前のパラメータがTrueのときだけ「手動承認(Approval)」アクションを挟みたいです。
EnableManualApprovalにFalseを指定したとき
EnableManualApprovalにTrueを指定したとき
やりかた
CodePipeline上のアクションのアクションは「リソース」ではなく「AWS::CodePipeline::Pipeline」というリソースのプロパティ階層の中で定義するので、Conditionkによって生成有無を分けることはできません。このために別々のPipeline定義を書くのはメンテナンスがしんどすぎます。
ググるとStack Overflowに求めていた回答がありました。
IF関数 を使い、条件一致する場合は「手動承認アクションの定義」を返し、条件一致しない場合おいうはAWS::NoValueを返せば実現できそうです。
以下のように書けばいい。
- !If
- 条件
- 手動承認アクション定義
- AWS::NoValue
「AWS::NoValue」使っている人からすれば「そらそうやで」という話ですが、初めて使いました
今回の対応差分
- ① EnableManualApprovalパラメータの定義
- ② IFで使いたいので EnableManualApprovalConditionsを定義
- ③ EnableManualApprovalConditionsが成立するときに Approvalアクションの定義を返す様に記載
意図した通りCloudFormationのパラメータ「EnableManualApproval」に「True」を指定した場合のみApprovalが挟まるようになりました。
蛇足: Approvalの通知について
パイプラインの進行状況はAWS ChatbotでSlackに流しているのでこの設定だけでもApprovalに気付けるのですが、表示が地味なのでお知らせ用のSNSを紐付けようかなと思います。