【AWS×Slack】非エンジニアでも安全にデプロイ。SlackワークフローとChatbotでCodePipelineを実行する仕組み
概要
Slackのチャンネルから、簡単な操作をするだけでAWS CodePipelineを実行し、ソースコードの反映から結果の確認までを完結させる仕組みを実装しました。
実装した背景
・Webサイトの文言変更などを企画部(非エンジニア)の方が実施されています。その変更をstg環境に反映・確認するためにはビルドし直す必要がありました。
そこで、「非エンジニアの方々が、開発チームに頼らず単独で作業(文言変更 → 反映 → 確認)を完結できる」ことを目的に、SlackワークフローとAWS CodePipelineの連携を実装しました。
本構成(Slack Workflow + AWS Chatbot)を採用したメリット
- 運用コストの削減: OAuth認証などの複雑なSlackアプリ管理が不要(マネージドサービスで完結)
- 高いセキュリティ: 実行権限の管理(IAM)をAWS側で一元管理でき、ガードレール機能で実行できる操作を絞り込める
-
拡張性:
@Amazon Q(旧@aws)コマンドを利用しているため、他AWSリソースの状態操作など容易に拡張できる
実装手順
検証環境用に実装した事例をもとにご説明します。
01. 事前準備
AWS・Slack両方で以下の準備をしておきます。
-
Slackワークフローを作成するチャンネルの用意: 例
#example_deploy_stg(Private CH) -
対象Pipelinesの名称確認: 例
example_stg_front,example_stg_front -
通知用のSNS Topicの用意: 例
example_stg_deploy(※Regionは問いません) - 通知設定の用意: 対象Pipelineの [Developer Tools > Notification rules] にて、上記SNSをターゲットにした状態通知(実行開始・成功・失敗)を設定しておく
02. CodePipeline実行用Lambda Function作成
AWS Chatbotから直接CodePipelineを実行するのではなく、一度Lambdaを挟むことで細かい制御(ペイロードのパース等)を行います。
① Lambda Functionの作成
以下の設定でLambda Functionを作成します。
-
Region: ap-northeast-1
-
Function Name:
example_stg_executepipelines(名称任意) -
Runtime: Python 3.14 (※執筆時点の最新版)
-
Architecture: x86_64
-
Role:
example_stg_executepipelines-role(新規作成。内容は後述) -
Code:
import json
import boto3
cp = boto3.client('codepipeline')
def lambda_handler(event, context):
# Slackから渡された変数を受け取る
codepipeline_name = event.get("pipeline_name")
# Pipelineの実行
response = cp.start_pipeline_execution(
name=codepipeline_name
)
# Slack(Chatbot)側に返すレスポンスを整形
return {
'statusCode': 200,
'body': f"Pipeline [{codepipeline_name}] execution started! (Execution ID: {response.get('pipelineExecutionId')})"
}
② Lambdaに付与するIAM Roleを作成・付与
LambdaがCodePipelineを実行するための権限を設定します。
- Role Name: example_stg_executepipelines-role
- Trusted entities:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
アタッチするポリシー:
- AWSLambdaBasicExecutionRole (AWS managed) # デフォルトPolicy
- example_stg_executepipelines-policy (Custom Policy)
Custom Policyの内容:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"codepipeline:StartPipelineExecution",
"codepipeline:GetPipeline",
"codepipeline:GetPipelineState"
],
"Resource": "arn:aws:codepipeline:ap-northeast-1:<AWSアカウントID>:example_*_front"
},
{
"Effect": "Allow",
"Action": [
"codepipeline:ListPipelines"
],
"Resource": "*"
}
]
}
💡 Tips:
codepipeline:ListPipelines のような一覧取得アクションは、仕様上リソースレベルの指定ができないため Resource: "*" としています。
03. Amazon Q Developer(AWS Chatbot)の用意
対象のSlackチャンネルとAWSを連携させます。
細かい手順は公式ドキュメントもご参照ください。
3-1. Slack WorkSpaceとの連携とチャネル設定
まずslack workspaceとの連携を行います。
Slack Workspace
- Slack workspace: (利用しているSlack Workspaceと連携)
Configure new channel
- Configuration name: example_stg_deploy
- Logging (optional):
- Publish logs to Amazon CloudWatch Logs:
- Errors only ✅️ (失敗時の原因調査用)
- Publish logs to Amazon CloudWatch Logs:
- Slack channel:
- Channel Type: (Private | Public)
- Channel ID: [(対象CHのID)]
💡 Tips:
プライベートチャンネルの場合は、事前にSlack側で/invite @Amazon Qコマンドを実行し、アプリを招待しておく必要があります。
3-2. ChatbotへのIAMロール(ガードレール)付与
Slackから「何でも実行できる」状態を防ぐため、特定のLambdaのみ実行を許可するガードレールポリシーを設定します。
- Channel role: 新規作成 (example_stg_deploy-chatbot 等)
- デフォルト + 後述するguardrail同様 lambda実行権限(invoke)が必要
- Channel guardrail policies: 以下のカスタムポリシーを作成してアタッチ
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:invokeAsync",
"lambda:invokeFunction"
],
"Resource": [
"arn:aws:lambda:ap-northeast-1:<AWSアカウントID>:function:example_*_executepipelines"
]
}
]
}
3-3. SNS Topicの紐付け
通知用に準備しておいたSNS Topic(example_stg_deploy)を設定します。
04. Slack ワークフローの作成
いよいよユーザーが触るインターフェースを作ります。
4-1. ワークフロー作成
■ ワークフロー作成
- slackアプリ適当なCHにて右上の三点リーダーより「ワークフローを追加する」を選択
- [ワークフローを作成する]ボタン押下
(もしくはSlackの「ワークフロービルダー」から新規作成します)
■ ワークフローの名称
- 「無題のワークフロー」という名称を選択して、下記のように変更
- アイコン: (任意)
- 名前: SlackワークフローによるCodePipeline実行
- 説明: SlackワークフローによるCodePipeline実行
■ イベントおよびステップの設定
- ワークフローを開始して... (イベントを選択)
- ワークフローのトリガー: 「絵文字リアクションが追加された時」
- 絵文字リアクション: 🤖 (任意)
- チャンネル: #example_deploy_stg
- 💡 Tips:
- (トリガーの選定理由)Slackの仕様上、「キーワードを含むメッセージ」をトリガーにできるのはパブリックチャンネルのみです。今回はプライベートチャンネルを使用するため、絵文字リアクションをトリガーとして採用しています。
- ワークフローのトリガー: 「絵文字リアクションが追加された時」
■ その後これらを実行
UXを考慮し、意図しない実行を防ぐためにステップを分割します。
- ステップ1: チャンネルへメッセージを送信する
- チャネルを選択する: #example_deploy_stg
- メッセージを追加する: 「リリース準備ができましたらボタンを押下ください」
- ボタンを追加する
- ボタンのラベル: [リリースを始める] + (適当な色)
- 動作: [続行するまたはワークフローを分岐する]
- シングルクリック: [有効]
- ステップ2: 情報をフォームで収集する
- フォームのタイトル: デプロイ環境
- 質問の追加
- 質問内容: デプロイする環境を選択してください
- 質問のタイプ: ドロップダウン
- ドロップダウンの選択肢: [dev, stg]
- ステップ3: チャンネルへメッセージを送信する
- チャネルを選択する: #example_deploy_stg
- メッセージを追加する:
[@Amazon Q lambda invoke --payload '{"pipeline_name":"example_{} デプロイする環境を選択してください_front"}' --function-name example_{} デプロイする環境を選択してください_executepipelines --region ap-northeast-1]
(※) 変数を挿入するボタンを押下すると 「{} デプロイする環境を選択してください」 のように質問内容分が挿入されます
- 設定を保存して、[公開]を押す
05. 動作確認
実際にSlackチャンネルで実行してみます。
- 適当なメッセージ(例:「リリース」)を投稿し、そのメッセージに🤖のリアクションを付与する
- ワークフローが起動し表示された[リリースを始める]ボタンを押下
- デプロイする環境をドロップダウンリストより選択(dev or stg)
- CodePipeline実行のコマンドが表示される
- [Run Command]ボタンを押下し、コマンドを実行する
- 確認
- 該当Lambdaの実行結果(StatusCode: 200)が返ってくること
- AWSコンソール上で指定Pipelineが実行されていること
- CodePipelineの実行開始・成功通知が同チャンネルに届くこと
06. まとめ
これにて「非エンジニアの方々が、開発チームに頼らず単独で作業(文言変更 → 反映 → 確認)を完結できる」ようになりました。参考になれば幸いです。
