---
# System prepended metadata

title: 「CDをSlackに通知&制御する仕組み」の仕様

---

他チームの仕様は[こちら](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とします)
        * もう１つは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)