Skip to content

Lambdaカスタムランタイムでbashを使ってみた

365日貯金 の貯金額を「今日」いくらすれば良いか、理論上いくら貯まっているか?、がわかるように、Lambda関数からSlackのWebhookにリクエストを投げて通知するようにしていたのだが、ランタイムをNode.js 8.10にしていたため、サポート終了して通知が来なくなってしまったので、せっかくなので、カスタムランタイムを使ってbashに変更してみたときのメモ。

元々のソース(Node.js)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
const request = require('request');

// 基準となる年を取得
var today = new Date();
var year = today.getFullYear();

// その年の1月1日を起算日にする
var basis = new Date( year + "/1/1" );

// 基準日からの経過日数を算出
var days = Math.floor( ( today.getTime() - basis.getTime() ) / ( 1000 * 60 * 60 * 24 ) ) + 1;

// 実行日までの貯金額を計算
var subtotal = 0;
subtotal = days * ( days + 1 ) / 2 ;

// メッセージを生成
var message = '@channel:' + "\n";

message += "今日は" + year + "年" + ( today.getMonth() + 1 ) + "月" + today.getDate() + "日です。\n\n";
message += "今日、貯金すべき金額は「" + days + "円」です。\n\n";
message += "ここまでちゃんと貯金していれば「" + subtotal.toLocaleString() + "円」貯まっているはずです…。"

var slackWebhookUrl = 'https://hooks.slack.com/services/{IncomingWebHooksURL}';

request.post({
  uri: slackWebhookUrl,
  headers: { 'Content-Type': 'application/json' },
  json: {
    text: message
  }
}, function(error, response, body){
  if (!error && response.statusCode === 200) {
    console.log(body);
  } else {
    console.log('error');
  }
});

作り替えたソース(bash)

一旦、以下の通り作成し、cloud9環境で実施し目的が果たせていることを確認する。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash

#今日 のUNIXTIMEを取得
FMT_TODAY=$(date '+%Y年%m月%d日')
UNIX_TODAY=$(date '+%s')

# 今年の1月1日を起算日にする
UNIX_BASIS=$(date -d $(date '+%Y/01/01') +%s)

# 基準日からの経過日数を算出
DAYS=$(expr \( ${UNIX_TODAY} - ${UNIX_BASIS} \) / 24 / 60 / 60 + 1)

# 実行日までの貯金額を計算
SUBTOTAL=$(( ${DAYS} * ( ${DAYS} + 1 ) / 2 ))

MESSAGE='@channel:'"\n"
MESSAGE=${MESSAGE}"今日は"${FMT_TODAY}"です。\n\n";
MESSAGE=${MESSAGE}"今日、貯金すべき金額は「"${DAYS}"円」です。\n\n";
MESSAGE=${MESSAGE}"ここまでちゃんと貯金していれば「"$(printf "%'d\n" ${SUBTOTAL})"円」貯まっているはずです…。"

SLACK_WEBHOOK_URL="https://hooks.slack.com/services/{IncomingWebHooksURL}"

curl -X POST -H 'Content-type: application/json' --data {"text":"'${MESSAGE}'"} ${SLACK_WEBHOOK_URL}

bootstrapの作成

1
以下の通り、bootstrapとして作成する。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/bin/sh

set -euo pipefail

# Initialization - load function handler
source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh"

# Processing
while true; do
  HEADERS="$(mktemp)"
  # Get an event
  EVENT_DATA=$(curl -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next")
  REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2)

  # Execute the handler function from the script
  RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA")

  # Send the response
  curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response" -d "$RESPONSE"
done

function.shの作成

ベースとなるfunction.sh

1
2
3
4
5
6
7
function handler() {
  EVENT_DATA=$1
  echo "$EVENT_DATA" 1>&2
  RESPONSE=$({ここに実行したいコマンドを挿入})

  echo $RESPONSE
}

編集したfunction.sh

作り替えたソース を実行したいコマンドとして以下の通り編集

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function handler() {
  EVENT_DATA=$1
  echo "$EVENT_DATA" 1>&2
  RESPONSE=$(#!/bin/bash

#今日 のUNIXTIMEを取得
FMT_TODAY=$(date '+%Y年%m月%d日')
UNIX_TODAY=$(date '+%s')

# 今年の1月1日を起算日にする
UNIX_BASIS=$(date -d $(date '+%Y/01/01') +%s)

# 基準日からの経過日数を算出
DAYS=$(expr \( ${UNIX_TODAY} - ${UNIX_BASIS} \) / 24 / 60 / 60 + 1)

# 実行日までの貯金額を計算
SUBTOTAL=$(( ${DAYS} * ( ${DAYS} + 1 ) / 2 ))

MESSAGE='@channel:'"\n"
MESSAGE=${MESSAGE}"今日は"${FMT_TODAY}"です。\n\n";
MESSAGE=${MESSAGE}"今日、貯金すべき金額は「"${DAYS}"円」です。\n\n";
MESSAGE=${MESSAGE}"ここまでちゃんと貯金していれば「"$(printf "%'d\n" ${SUBTOTAL})"円」貯まっているはずです…。"

SLACK_WEBHOOK_URL="https://hooks.slack.com/services/{IncomingWebHooksURL}"

curl -X POST -H 'Content-type: application/json' --data {"text":"'${MESSAGE}'"} ${SLACK_WEBHOOK_URL})

  echo $RESPONSE
}

あとは、bootstrapfunction.sh をzipファイルとして圧縮しておく。

Lambdaへの登録

あとは以下の通りランタイムを設定した、Lambdaファンクションを作成し、前工程で作成したzipファイルをアップロードして登録する。

項目 設定値
ランタイム Amazon Linux 2 でのカスタムランタイム
ハンドラ function.handler