年中アイス

いろいろつらつら

Apexでlambda slack POSTにGoを使う

以前のエントリで、Lambda Node.js 4.3を使ってSlackにPostしていました。

reiki4040.hatenablog.com

普段Javascriptは書かないので、Goで書いてApexでデプロイする版を試しました。

ApexはLambdaのコードを管理(?)、デプロイするツールで、PythonやNode.jsなどのLambda対応言語はもちろん、GoをLambdaで実行(Node.js経由)することができます。

Apex自体は参考にしたページの方が詳しいのでそちらを。

dev.classmethod.jp

qiita.com

Apexを使ってGoでslackにpostするLambda functionを作る

今回のApexプロジェクトディレクトリを作って、初期設定します。

mkdir post-slack
cd post-slack
apex init

Project nameとdescriptionを聞かれるので、project name: post-slackとdescriptionは空白のままEnter。

             _    ____  _______  __
            / \  |  _ \| ____\ \/ /
           / _ \ | |_) |  _|  \  /
          / ___ \|  __/| |___ /  \
         /_/   \_\_|   |_____/_/\_\



  Enter the name of your project. It should be machine-friendly, as this
  is used to prefix your functions in Lambda.

    Project name: post-slack

  Enter an optional description of your project.

    Project description:

  [+] creating IAM post-slack_lambda_function role
  [+] creating IAM post-slack_lambda_logs policy
  [+] attaching policy to lambda_function role.
  [+] creating ./project.json
  [+] creating ./functions

  Setup complete, deploy those functions!

    $ apex deploy

ディレクトリ、ファイルが作成され、Lambda function用のRoleが自動作成されます。

slackにPOSTするfunctionの作成

新しいfunction用のディレクトリを作ります。go-generalは、general channelにPOSTしていたののGo版という意味でつけてます。

mkdir functions/go-general

次に、ここにあるGoのファイルを持ってきます。

curl -o functions/go-general/main.go https://gist.githubusercontent.com/reiki4040/afe3bd4317992b4748b0983f51058fae/raw/078b143186e03b45322d8373d5747afa78e801b8/main.go

最後に、環境変数用のfunction.jsonを作成します。(自分の環境のslack URLに置き換えてください)

echo '{
  "environment":{
    "SLACK_WEBHOOK_URL": "REPLACE YOUR SLACK WEBHOOK URL"
  }
}' > functions/go-general/function.json

ディレクトリ/ファイル構成は、こんな感じになります。

post-slack/
├── functions/
│   ├── go-general/
│   │   ├── function.json
│   │   └── main.go
│   └── hello/
│       └── index.js
└── project.json

deploy (Lambda functionの作成)

apex deployだけだと、サンプルのhello functionもアップされるので、function名を指定します。

apex deploy go-general

以下のように作成されます。

 • creating function         env= function=go-general
 • created alias current     env= function=go-general version=1
 • function created          env= function=go-general name=post-slack_go-general version=1

あとは元のエントリにあるように、functionの詳細から[Test]で、同じようにJSONを与えてあげると、slackにPOSTされます。 同様に、中編後編をやると、API gatewayでWebAPIにできます。

所感

Apex便利ですね。Goだとサードパーティライブラリを使ってもバイナリにまとまるので、Lambdaの実行環境の影響を受けません*1 その代わり、このapexのディレクトリ構成上、Goのvendoringは一工夫要りそうな感じです。

参考など

*1:cgo関係はダメかもですが、pure goは性質上いけるはず