プロジェクト

全般

プロフィール

第8回【いろいろなサービス使ってみよう編その5】

Slackのslashコマンド

"/"から始まるコマンドを自作することができる(組み込みのものに追加で)。
(ただし3秒以内にレスポンスを返す必要あり。重い処理は別Lambdaにして受け付けたLambdaから非同期起動)

https://slack.com/intl/ja-jp/help/articles/201259356-Slack-%E3%81%AE%E3%82%B9%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89
https://api.slack.com/interactivity/slash-commands

今回はこのSlashコマンドのバックエンドをサーバレスアーキテクチャ(ApiGateway+Lambda)で構築してみます。

下記は、SlashコマンドからEC2インスタンスを起動したり停止したりできるようにしてみている例です。
このような環境を作っておくと、開発・勉強用のLinuxサーバ(EC2インスタンス)を作っている場合などに、いちいちAWSのコンソールを開かなくてもSlack上から手軽に起動停止が行えるので便利だったりします。

slackwithlambda

参考:【入門】Slack のコマンドを作ってみよう!(同期実行版)
参考:【入門】Slack のコマンドを作ってみよう!(非同期実行版)

Slackのapiコンソール上でSlashコマンドの設定

(私の方でやるので、画面共有で見ていてください)

ApiGatewayとLambdaのリソース構築

Lambdaのサンプルコード(python)


import json

# 超シンプルなサンプル

# 本来やるべきこと
# ・bodyパラメータにコマンドのパラメータなどが入っているのでparseして使う
# ・secretとシグネチャを使ってリクエストの妥当性検証
# ・secretはSecretsManagerあるいはSSMのパラメータストアに持つ
# (こちら様の記事↓などをご参考に)
# https://dev.classmethod.jp/articles/lets-make-slack-commands-synchronous-execution-version/

def lambda_handler(event, context):

    print('body:', json.dumps(event["body"], indent=2))

    resBody = {
        "response_type": "in_channel",
        "text": "Hello SlashCommand."
    }
    return {
        "statusCode": 200,
        "body": json.dumps(resBody),
    }


動作確認

Slack上からコマンド打って、サーバ(EC2インスタンス)が起動したり停止したりすることを確認します。


CodeCommitとCode系サービス

CodeCommitはAWSが提供するgitリポジトリです。
最初の5人まで無料で使える永続的な無料枠があるので個人利用であれば無料で使うことができます。

https://aws.amazon.com/jp/codecommit/

CodeCommitにリポジトリを作成し、githubから取得したソースを自身のAWSアカウントのgitリポジトリにもCloud9上から登録してみます。

gitのコマンド

# clone
git clone https://github.com/kinocoffeeblack/lambda-edge-resize-sample

# originの変更
git set-url origin 作成したCodeCommitのURL

# push
git push orign master

※ originをgithubにしたままで別のリモートリポジトリとして使う場合は、"set-url"ではなく"git remote add"を使います。

Code系サービスにはほかにもCodeBuild, CodeDeployやこれらを繋いでgitリポジトリへのpushをトリガにビルド・デプロイまでを自動化させるCodePipelineというサービスがあります。

例)

  • クライアントアプリケーション用のリポジトリ(上の特定のブランチ)へのpush → "npm run build"→ビルド成果物をS3バケットへ展開
  • Lambda用のリポジトリ(上の特定のブランチ)へのpush → "sam build" → "ビルド成果物をCloudFormationでデプロイ"

これらのプロセスを自動化させるためには、ビルド内容を記載した"buildspec.yml"というファイルをソースコード内に含めておく必要があります。
これにより、CodeBuildのプロセスでビルド用一時的にEC2インスタンスが起動しbuildspecに記載の内容でビルドを行いビルド成果物を作成します。

他にもCodeStarなどのサービスがありますがこちらは私はまだあまり触ったことがないので説明は割愛します。


gitとgit-flow

バージョン管理にgitを使うのはもはや当たり前なので、もしまだ使っていないのであれば慣れておくべき。
ブランチ運用はgit-flowが基本なので共同作業するなら覚えておくべき。

backlogのgit入門記事(サル先生のgit入門)
[日本語訳]A successful Git branching model


リソースの削除

1年間の無料枠内であればt2.microのEC2インスタンス料金はかからないですし、EBSも30GBまでは無料なのでかからないかとは思いますが一応削除しておきましょう。
ApiGatewayとLambdaは使われなければお金かかりませんが、無駄なものは削除しておきましょう(削除しても同じ手順で簡単に作成できますので)。

Slackコマンドの方は私の方で削除しておきます。