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