CloudWatch EventsでLambda関数を定期実行してみます。
前提条件
CloudWatch Eventsへの権限
CloudWatch Eventsに対してフル権限があること。
Lambdaへの権限
Lambdaに対して読み取り権限があること。
AWS CLI
以下のバージョンで動作確認済
- AWS CLI 1.10.17
aws --version
aws-cli/1.10.17 Python/2.7.10 Darwin/15.4.0 botocore/1.4.8
- 準備
=======
0.1. 変数の確認
プロファイルが想定のものになっていることを確認します。
aws configure list
Name Value Type Location
---- ----- ---- --------
profile administrator-prjz-mbp13 env AWS_DEFAULT_PROFILE
access_key ****************XXXX shared-credentials-file
secret_key ****************XXXX shared-credentials-file
region ap-northeast-1 env AWS_DEFAULT_REGION
プロファイルが想定のものになっていることを確認します。
- 事前準備
==============
1.1. イベント名の決定
EVENTS_RULE_NAME='good_morning_lambda'
同名のイベントが存在しないことを確認します。
aws events describe-rule \
--name ${EVENTS_RULE_NAME}
A client error (ResourceNotFoundException) occurred when calling the DescribeRule operation: Rule good_morning_lambda does not exist.
descriptionも必ず指定しておきましょう。
EVENT_RULE_DESC="good morning rule."
1.2. スケジュールの指定
EVENT_SCHEDULE_EXP='cron(0/5 * ? * * *)'
- イベントの作成
================================
2.1. イベントの作成
cat << ETX
EVENTS_RULE_NAME: ${EVENTS_RULE_NAME}
EVENT_SCHEDULE_EXP: ${EVENT_SCHEDULE_EXP}
EVENT_RULE_DESC: "${EVENT_RULE_DESC}"
ETX
aws events put-rule \
--name ${EVENTS_RULE_NAME} \
--schedule-expression "${EVENT_SCHEDULE_EXP}" \
--description "${EVENT_RULE_DESC}"
{
"RuleArn": "arn:aws:events:ap-northeast-1:XXXXXXXXXXXX:rule/good_morning_lambda"
}
2.2. イベントの確認
aws events list-rules
{
"Rules": [
{
"State": "ENABLED",
"ScheduleExpression": "cron(0/5 * ? * * *)",
"Name": "good_morning_lambda",
"Arn": "arn:aws:events:ap-northeast-1:XXXXXXXXXXXX:rule/good_morning_lambda",
"Description": "good morning rule."
}
]
}
aws events describe-rule \
--name ${EVENTS_RULE_NAME}
{
"ScheduleExpression": "cron(0/5 * ? * * *)",
"Name": "good_morning_lambda",
"State": "ENABLED",
"Arn": "arn:aws:events:ap-northeast-1:XXXXXXXXXXXX:rule/good_morning_lambda",
"Description": "good morning rule."
}
- ターゲットの追加
================================
3.1. ターゲットの確認
ルールを作成した直後は、ターゲットが存在しません。
確認してみましょう。
aws events list-targets-by-rule \
--rule ${EVENTS_RULE_NAME}
{
"Targets": []
}
3.2. Lambda関数の指定
定期実行するLambda関数の名前を指定します。
put-targets
LAMBDA_FUNC_NAME='good_morning_lambda'
Lambda関数のARNを取得します。
LAMBDA_FUNC_ARN=$( \
aws lambda get-function \
--function-name ${LAMBDA_FUNC_NAME} \
--query 'Configuration.FunctionArn' \
--output text \
) \
&& echo ${LAMBDA_FUNC_ARN}
arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:good_morning_lambda
3.3. ターゲットID
ターゲットIDを指定します。
EVENTS_TARGET_ID='Id1'
ターゲットIDとLambda関数のARNを紐付けます。
cat << ETX
EVENTS_TARGET_ID: ${EVENTS_TARGET_ID}
LAMBDA_FUNC_ARN: ${LAMBDA_FUNC_ARN}
ETX
EVENTS_TARGETS="Id=${EVENTS_TARGET_ID},Arn=${LAMBDA_FUNC_ARN}"
3.4. ターゲットの追加
cat << ETX
EVENTS_RULE_NAME: ${EVENTS_RULE_NAME}
EVENTS_TARGETS: ${EVENTS_TARGETS}
ETX
aws events put-targets \
--rule ${EVENTS_RULE_NAME} \
--targets ${EVENTS_TARGETS}
{
"FailedEntries": [],
"FailedEntryCount": 0
}
3.5. ターゲットの確認
aws events list-targets-by-rule \
--rule ${EVENTS_RULE_NAME}
{
"Targets": [
{
"Id": "Id1",
"Arn": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:good_morning_lambda"
}
]
}
3.6. ターゲットのARN取得
ターゲットのARNを元に、同一ターゲットが使われているルールを検索することができます。
まず、ターゲットのARNを取得します。
EVENT_TARGET_ARN=$( \
aws events list-targets-by-rule \
--rule ${EVENTS_RULE_NAME} \
--query "Targets[?contains(Arn, \`${LAMBDA_FUNC_NAME}\`)].Arn" \
--output text \
) \
&& echo ${EVENT_TARGET_ARN}
arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:good_morning_lambda
list-rule-names-by-targetサブコマンドでターゲットARNを指定することで、そのターゲットを利用しているルールのリストを取得することができます。
aws events list-rule-names-by-target \
--target-arn ${EVENT_TARGET_ARN}
{
"RuleNames": [
"good_morning_lambda"
]
}
3.7. メッセージの受信
5分以内にslackのチャンネルにメッセージが届いていればOKです。
- ルールの無効化/有効化
================================
一時的にルールを無効化してみましょう。
4.1. ルールの無効化
現在のルールの状態を確認します。
EVENT_RULE_STATE=$( \
aws events describe-rule \
--name ${EVENTS_RULE_NAME} \
--query 'State' \
--output text \
) \
&& echo ${EVENT_RULE_STATE}
ENABLED
ルールの無効化をしてみましょう。
aws events disable-rule \
--name ${EVENTS_RULE_NAME}
EVENT_RULE_STATE=$( \
aws events describe-rule \
--name ${EVENTS_RULE_NAME} \
--query 'State' \
--output text \
) \
&& echo ${EVENT_RULE_STATE}
DISABLED
4.2. ルールの有効化
ルールの有効化を再度有効化する場合は、enable-ruleコマンドを利用します。
aws events enable-rule \
--name ${EVENTS_RULE_NAME}
EVENT_RULE_STATE=$( \
aws events describe-rule \
--name ${EVENTS_RULE_NAME} \
--query 'State' \
--output text \
) \
&& echo ${EVENT_RULE_STATE}
ENABLED
- スケジュールの変更
================================
5.1. スケジュールの指定
動作確認が取れたら、起動時間を朝に設定してみましょう。
時刻指定はUTCで指定します。日本時間7時に指定する場合は22を指定します。
EVENT_SCHEDULE_EXP='cron(0 22 ? * * *)'
5.2. ルールの更新
ルールを更新します。
cat << ETX
EVENTS_RULE_NAME: ${EVENTS_RULE_NAME}
EVENT_SCHEDULE_EXP: ${EVENT_SCHEDULE_EXP}
ETX
aws events put-rule \
--name ${EVENTS_RULE_NAME} \
--schedule-expression "${EVENT_SCHEDULE_EXP}"
{
"RuleArn": "arn:aws:events:ap-northeast-1:XXXXXXXXXXXX:rule/good_morning_lambda"
}
5.3. ルールの確認
aws events describe-rule \
--name ${EVENTS_RULE_NAME}
- 後始末
6.1. ターゲットの削除
ARRAY_EVENTS_TARGET_IDS='Id1'
aws events remove-targets \
--rule ${EVENTS_RULE_NAME} \
--ids "${ARRAY_EVENTS_TARGET_IDS}"
{
"FailedEntries": [],
"FailedEntryCount": 0
}
6.2. ルールの削除
cat << ETX
EVENTS_RULE_NAME: ${EVENTS_RULE_NAME}
ETX
aws events delete-rule \
--name ${EVENTS_RULE_NAME}
(戻り値なし)
aws events list-rules
{
"Rules": []
}