0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS×Slack】非エンジニアでも安全にデプロイ。SlackワークフローとChatbotでCodePipelineを実行する仕組み

0
Posted at

【AWS×Slack】非エンジニアでも安全にデプロイ。SlackワークフローとChatbotでCodePipelineを実行する仕組み

概要

Slackのチャンネルから、簡単な操作をするだけでAWS CodePipelineを実行し、ソースコードの反映から結果の確認までを完結させる仕組みを実装しました。

構成図
図1: Slack Workflowと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"
        }
    ]
}

アタッチするポリシー:

  1. AWSLambdaBasicExecutionRole (AWS managed) # デフォルトPolicy
  2. 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 ✅️ (失敗時の原因調査用)
  • 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チャンネルで実行してみます。

  1. 適当なメッセージ(例:「リリース」)を投稿し、そのメッセージに🤖のリアクションを付与する
  2. ワークフローが起動し表示された[リリースを始める]ボタンを押下
  3. デプロイする環境をドロップダウンリストより選択(dev or stg)
  4. CodePipeline実行のコマンドが表示される
  5. [Run Command]ボタンを押下し、コマンドを実行する
  6. 確認
    • 該当Lambdaの実行結果(StatusCode: 200)が返ってくること
    • AWSコンソール上で指定Pipelineが実行されていること
    • CodePipelineの実行開始・成功通知が同チャンネルに届くこと

06. まとめ

これにて「非エンジニアの方々が、開発チームに頼らず単独で作業(文言変更 → 反映 → 確認)を完結できる」ようになりました。参考になれば幸いです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?