他チームの仕様は[こちら](https://hackmd.io/TP5-phj5RkKHJcbG9vQbuw#%E4%BB%8A%E5%9B%9E%E3%81%AETerraform%E3%81%AE%E8%A6%81%E4%BB%B6%E4%BB%95%E6%A7%98) # 「CDをSlackに通知&制御する仕組み」の仕様 [このレポジトリ](https://github.com/nagaseitteam/it_terraform)のproductionブランチから切って書いていき、productionにプルリクを出してください。今回は`slack`モジュールと命名し、modules/slack/*に書いていきましょう。 環境ごとに分ける必要がないので、envs/common.tfで作ったslack moduleを呼び出します。 * 前提1. CodePipelineの理解 * CodePipelineはCICDパイプラインをうまくつくってくれるサービスです。今回のITチームではFargateにデプロイするための4つのパイプラインがあります。 * 1. djangoアプリ、本番環境 * 2. djangoアプリ、ステージング環境 * 3. fastapiアプリ、本番環境 * 4. fastapiアプリ、ステージング環境 * Fargateへの自動デプロイにはいくつかのステップ(=ステージ)が必要です。 * 1. Sourceステージ: GitHubの変更を感知してソースコードを取ってくる * 2. Buildステージ: Dockerfileをもとにビルドする * 3. Approvalステージ: AWS管理画面から、人間が、「本当にデプロイするか?」のチェックをする * 4. Deployステージ: 2でビルドされたDockerイメージをFargateに適応する * これら4つのステージを束ねて、連動させる機能があるのがCodePilineです。 * 今回はApprovalステージでAWS管理画面からポチッとせずにSlackでボタンを押すだけでいいような機能を実装します。 全体像はこれです。![](https://i.imgur.com/R20gZqo.png) * 前提2. SNSの理解 * SNSはイベントをつなぐ「ハブ」のような存在です。 * ここでいうイベントとは、「CodePipelineのApprovalステージに入ったイベント」などがあります。 * SNSにイベントが入ったことをトリガーにLambda関数を発火させることができます。 * 前提3. 作るべきLambda関数 * 今回は2つのLambda関数が必要です。 * 1つはSNSのイベントをトリガーに発火して、Slackを叩くもの(LambdaAとします) * もう1つはSlackからのPOSTリクエストで発火して、Approvalステージを承認するものです。(LambdaBとします) 以下が今回のSlack moduleの仕様です。 * 1. SNSトピックを作成 * スタンダードなものでいいです。 * 2. LambdaAを作成 * Python3.9で、コードは部分はまだ適当なprint('test')くらいでいいです。 * ロールはvar.slack_lambda_role.arnでおいて外から呼び出し * 参考:[Terraformで構築するAmazon SNSからAWS Lambdaを呼び出すためのトリガ](https://qiita.com/hayaosato/items/fc3e4e8be285e8dbbd5c) * 2. LambdaBを作成 * Python3.9で、コードは部分はまだ適当なprint('test')くらいでいいです。 * ロールはvar.approve_lambda_role.arnでおいて外から呼び出し * 3. LambdaBにFunction URLsを追加する * Qiitaの記事にはLambdaBを発火させるためのAPIGatewayがありましたが、2022年Lambdaが成長しAPIGatewayなしでも関数を発火できる機能ができました。 * 認証はなしでいいです * 4. cd moduleを編集する * CodepipelineのApprovalステージでSNSにイベントを送信するようにする必要があります * 参考:[誰かのgist](https://gist.github.com/huksley/a25012dbe81836936790493a7e84345e)