DynamoDBにめっちゃ書き込んで、めっちゃ読み込むサービスの設計のためにDAXの調査をしていました。
LambdaとDAXを連携させるメリットはここにもある通り、
For serverless applications, DAX provides an additional benefit: Lower latency results in shorter Lambda execution times, which means lower costs.
そう、Lambdaの実行時間が減ればやすくなるよね!ということ。
早速試してみました
環境
- AWS Lambda(node.js8.1)
【困ったこと】LambdaではデフォでDAXを扱うライブラリが入っていない。
ここにあるとおりDAXの利用はnodejsでは下記のライブラリを使います。
amazon-dax-client
これは、Lambdaにデフォで入っていません。
なので、amazon-dax-client
が入ったものをzip化してアップロードするしかありません。
【苦戦】DAXにつながらない
結論からいうとLambdaの実行ロールであるIAMポリシーに下記のポリシーが足りていませんでした。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"dax:*"
],
"Effect": "Allow",
"Resource": [
"*"
]
},
{
"Action": [
"dynamodb:*"
],
"Effect": "Allow",
"Resource": [
"*"
]
}
]
}
これは、AmazonDynamoDBFullAccess
を紐付けることで解決します。
なぜ四苦八苦したのか。
それは自分のエラーメッセージ理解力が問題でした。
表示されていたメッセージたち
UnhandledPromiseRejectionWarning: Error: NoRouteException: No endpoints available
{ Error: NoRouteException: not able to resolve address: [{"host":"***************","port":8111}]
Failed to pull from ********.dax.apne1.cache.amazonaws.com (10.0.1.47): { Error: Client does not have permission to invoke Endpoints
これをSecurityGroupまわりの設定ミスなのか? いや合っているはずなんだけどな とドツボにハマってました。
SecurityGroupはTCP、ポート8111、許可するもの(IP、セキュリティグループID)でオッケーです。