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
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
| 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
}
|
あとは、bootstrap
と function.sh
をzipファイルとして圧縮しておく。
Lambdaへの登録
あとは以下の通りランタイムを設定した、Lambdaファンクションを作成し、前工程で作成したzipファイルをアップロードして登録する。
項目 |
設定値 |
ランタイム |
Amazon Linux 2 でのカスタムランタイム |
ハンドラ |
function.handler |