LoginSignup
0
0

More than 3 years have passed since last update.

Lambda関数から別アカウントのDynamoDBに接続

Posted at

記事を書いた経緯

  • 初めてAWSを触った!記録取っておこう!
  • Lamdba関数から他アカウントのDynamoDBにアクセスを経験!個人的に詰まったところもあったので、同じミスはしないように記録として残そう!
  • ナレッジ化して共有できればいいなー

って感じです。初投稿なので、「ん?」って思うところがあるかもしれないですが、参考になれば幸いです。

環境

  • Typescript
  • DynamoDB
  • Lambda

まず驚いたこと

Lamdba関数からただ単にaws-sdkDynamoDB 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について

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0