2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

UzabaseAdvent Calendar 2021

Day 19

SlackからCodeBuildを走らせるシンプルな方法

Last updated at Posted at 2021-12-18

はじめに

AWSビギナーによる自由研究です。SlackからAWS CodeBuildを走らせる方法を試してみました。
(最終的な活用イメージはこちら

概要

構成の全体像と、今回活用したAWSの各サービスの概要を紹介します。

全体構成

Slackから、ChatbotとLambdaを経由してCodeBuildを起動します。

  1. Slack workflowからデプロイをkick
  2. Chatbot、Lambda経由でCodeBuildをstart
  3. CodeBuildの実行ステータスをChatbot経由でSlackにpost

image.png

各サービスの役割

今回は、Chatbot・Lambda・CodeBuildの3つのAWSのサービスを使用します。

Chatbot

AWS内⇔AWS外のインターフェース機能です。
今回はSlackとAWSの接続に活用し、下記を実行します。

  • SlackからLambdaを起動
  • CodeBuildの実行ステータスをSlackに通知

Lambda

サーバーレスでプログラムを実行できるサービスです。
今回は、CodeBuildによるビルドを開始するプログラムとして活用します。

CodeBuild

AWS上で動作するビルドサービスです。
今回は下記を実行するよう設定済みです。(本題から外れるため、詳細は割愛します。)

  • ビルド(GitHub上のソースコードを、実際に動作するプログラムに変換)
  • デプロイ(ビルド成果物をS3に配置)
  • リリース(CloudFrontのキャッシュクリア)

手順

具体的な設定手順です。

1. Chatbotの作成

AWSと連携したいSlackチャネルを登録したChatbotを作成します。
ロールには下記ポリシーをアタッチしておきます。

  • 通知のアクセス許可
  • Lambda呼び出しコマンドのアクセス許可

image.png

2. Lambda関数の作成

CodeBuildの開始に必要なロールを作成した上で、このロールを持たせたLambda関数を作成します。

ロールを作成
下記ポリシーを持つロールを作成します。

  • AWSLambdaBasicExecutionRole(AWS管理ポリシー)
  • CodeBuildのポリシー(下記JSONで作成)
json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "codebuild:StartBuild",
            "Resource": "{CodeBuildのリソース名}"
        }
    ]
}

Lambda関数を作成
Lambda関数のメタデータを作成します。

  • 上記で作成したロールを適用
  • 今回はランタイムにpython 3.8を選択

image.png

関数のコードを記述
Lambda関数のコード部分を書いていきます。

  • event[xxx]は、SlackからChatbot経由で送信可能な変数
  • projectName、sourceVersionはCodeBuildの設定や命名に合わせて記載
Lambda
import os
import boto3
from logging import getLogger, INFO

logger = getLogger()

codebuild_client = boto3.client('codebuild')

def lambda_handler(event, context):
    codebuild_client.start_build(
        projectName=event["target_env"] + '{リポジトリ名等}', //CodeBuildのプロジェクト名
        sourceVersion=event["target_branch_name"]
    )

3. CodeBuildの通知ルールを作成

CodeBuildの対象プロジェクトから、通知ルールを作成します。
これにより、CodeBuildの実行ステータスをChatbot経由でSlackに通知できます。

"通知"メニューから通知ルール作成画面に遷移
image.png

お好みのイベントを選択
image.png

ターゲットはターゲットタイプ:AWS Chatbot (Slack)から今回作成したChatbotを選択
image.png

4. SlackチャネルにChatbotを招待

下記コマンドでChatbotをチャネルに招待することで、該当のSlackチャネルからChatbotを操作できるようになります。

Slack
/invite @aws

あとは、Slackチャネルで下記コマンドを打てばCodeBuildが走りだすはずです。

Slack
@aws invoke {Lambda関数名} --payload {“target_env”: “xxx”, “target_branch_name”: “xxx”}

5. 起動コマンドのworkflow化

上記コマンドを毎回打つのは面倒ですよね。起動コマンドをworkflow化しておきましょう。
下記は参考記事です。

活用イメージ

1. Slack Workflowでデプロイ条件を指定しSubmit

2. 内容に問題なければ"Run"ボタンをクリック

3. CodeBuildが走りだし、実行ステータスの通知を受領

最後に

シンプルな構成なので手順も簡単だったと思います。
目に見える効果がありつつAWSの複数のサービスが触れて、AWSビギナーとしては良い題材でした。
CodePipelineやStep Functionsを使うと、より高度な仕組みを構築できそうなので、今後チャレンジしてみたいと思います。
(参考)AWS Step Functions を利用したCI フローについて

参考

Slack と AWS Chatbot で ChatOps をやってみよう
SlackでAWS Lambdaを実行してみた

2
1
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
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?