記事を書いた経緯
- 初めてAWSを触った!記録取っておこう!
- Lamdba関数から他アカウントのDynamoDBにアクセスを経験!個人的に詰まったところもあったので、同じミスはしないように記録として残そう!
- ナレッジ化して共有できればいいなー
って感じです。初投稿なので、「ん?」って思うところがあるかもしれないですが、参考になれば幸いです。
環境
- Typescript
- DynamoDB
- Lambda
まず驚いたこと
Lamdba関数からただ単にaws-sdk
のDynamoDB Client
を作ってアクセスをしたらResourceNotFoundException
になった。。。
なぜだ。。。
NGコード
import{DynamoDB}from"aws-sdk"constclient=newDynamoDB.DocumentClient()constparam={TableName:"sample",Key:{'id':1},}constresult=docClient.get(param)
結論
他アカウントにアクセスする際にAssume Roleを行い、権限を付与しなければいけなかった。
(今思えば、それはそうだよなーってなった。。endpointがわかれば誰でもアクセスできるなんてセキュリティアウトだろ!)
色々試行錯誤して、以下のコードで正常にレスポンスが返ってきた!
ヨシッ!
OKコード
import{DynamoDB,STS,Credentials}from"aws-sdk"conststs=newSTS()// Lambda実行アカウント情報constaccount=sts.getCallerIdentity((error:any,data:any)=>{if(error)returnerrorreturndata}).promise()// assume roleconstrole=sts.assumeRole({RoleArn:[IAM],//権限を付与するIAMのARNRoleSessionName:'sample',// ここはなんでもいいExternalId:account['Account']// 外部キーにアカウントIDを指定したケースなので、ここは任意}).promise()// クレデンシャルconstcredentials=newCredentials(role.Credentials.AccessKeyId,role.Credentials.SecretAccessKey,role.Credentials.SessionToken)// clientインスタンス作成constclient=newDynamoDB.DocumentClient({credentials})constparam={TableName:"sample",Key:{'id':1},}constresult=docClient.get(param)
今回省略した内容
- Lamdba関数にAssume Roleの権限を与える
- Assume Roleについて
参考資料
- DynamoDB操作
- Assume Roleについて