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ファイルをアップロードして登録する。