この記事は、「Amazon Web Servicesを使ったサーバーレスアプリケーション開発ガイド」Chapter3-1、「Amazon CloudWatchのアラームをトリガーに自動処理をする」に挑んだときの記録です。

基本的には、動かない原因の発見方法の解説とその改修をしています。
AWSを使った場合のトラブルシューティングの参考になればいいなと。
本を読んでいないと、なんかよくわからないと思いますが、ご了承ください。

使用環境

使っている環境は以下になります。

aws-cli/1.15.63
Python/3.6.5
Linux/4.15.0-29-generic
botocore/1.10.62

本では東京リージョンを使っていますが、ここではバージニア北部リージョンを使用しています。

サンプルプログラムの修正

サンプルプログラムはそのままだとエラーが出るので1ヶ所修正します。

# logger.info("Set a threshold value to " + new_threshold)
logger.info("Set a threshold value to " + str(new_threshold))

この修正をしないと、shard countは変更されるものの、threshold変更前にコケるのでthresholdが変更されません。
本の通りの確認だとちゃんと動いたように見えます。

handlerの名前を間違った

ひと通り、本に沿ってプログラム作成、デプロイを行って実行してみます。
動作を確認してみたところ、変更されるはずのshard countが変更されていません。
ログを確認してみることに。

Lambdaのログの確認はAWSのマネジメントコンソールを使います。
さすがにcliだとつらいので。

  1. AWSマネジメントコンソールにログインし、
  2. サービスからCloudWatchに移動し、
  3. ログを選択します。
  4. ロググループにresharding-functionとあるものを選び、
  5. その中から最新のログストリーム(おそらく一番上)を選ぶと見れます。

ログを見るとエラーを発見しました。

Handler 'lambda-handler' missing on module 'resharding-function': module 'resharding-function' has no attribute 'lambda-handler'

「resharding-functionの中にlambda-handlerなんてないよ」とのことです。
調べてみるとresharding-function.pyではlambda_handlerとなっていました。
どうやら、lambdaの関数を作るときにtypoしてしまったようです。
handlerの指定を修正します。

$ aws lambda update-function-configuration --function-name resharding-function \
  --handler resharding-function.lambda_handler

もう一度実行し、結果を確認します。が、またしても動かない。

またtypo。今度はソースコードで

ログを確認すると。

module initialization error: module 'boto3' has no attribute 'cleint'

またtypo。今度はソースコードです。
修正し、もう一度zipし、アップロードします。

$ aws lambda update-function-code --function-name resharding-function \
  --zip-file fileb://./resharding-function.zip

再実行します。今度はちゃんと動いてshard countが変更されました。

いらないものを削除する

本はここでおしまいなのですが、出したものは出しっぱなしにせずに、ちゃんと後片付けをしないといけません。
料金が発生するものもありますし、だいたい二度と使わないでしょう。

ラムダの関数を削除する

$ aws lambda delete-function --function-name resharding-function
$ aws sns list-topics

{
    "Functions": []
}

SNSのトピックを削除する

$ aws sns delete-topic --topic-arn arn:aws:sns:us-east-1:111122223333:sample
$ aws sns list-topics

{
    "Topics": []
}

Kinesisのストリームを削除する

$ aws kinesis delete-stream --stream-name sample
$ aws kinesis list-streams

{
    "StreamNames": []
}

クラウドウォッチのアラームを削除する

$ aws cloudwatch delete-alarms --alarm-names kinesis-mon
$ aws cloudwatch describe-alarms --alarm-names kinesis-mon

{
    "MetricAlarms": []
}

ログを削除する

$ aws logs delete-log-group --log-group-name /aws/lambda/resharding-function
$ aws logs describe-log-groups \
  --log-group-name-prefix /aws/lambda/resharding-function

{
	 "logGroups": []
}

IAMのロールを削除する

$ aws iam delete-role --role-name resharding_function_role
$ aws iam list-roles

{
    "Roles": []
}

これできれいになりました。