Karakuri.com

ベンチャー企業で働くソフトウェアエンジニアの技術録

Serverless Framework+Lambda+Node.js+TypeScriptで別のAWSアカウントのDynamoDBにアクセスする

スポンサーリンク

いわゆるAWSのクロスアカウントでリソースにアクセスする方法についてのメモです。方法はいくつかあるのですが、STSを使った方法が汎用的に見えたので採用しました。

  const sts = new STS();
  const roleResponse = await sts
    .assumeRole({
      RoleArn: ROLE_ARN,
      RoleSessionName: "TEST",
    })
    .promise();

  const dynamoDB = new DynamoDB({
    credentials: new AWS.Credentials(
      roleResponse.Credentials.AccessKeyId,
      roleResponse.Credentials.SecretAccessKey,
      roleResponse.Credentials.SessionToken
    ),
  });

STSでロール情報を取得し、それをリソースのインスタンス生成時に渡してあげるだけです。AWS SDKの構文は同じなので、他のリソースに関しても同様の方法でクロスアカウントでアクセスできます。

iamRoleStatements: [
  {
    Effect: "Allow",
    Action: ["sts:AssumeRole"],
    Resource: "*",
  },

serverless.tsにsts:AssumeRoleを許可するのを忘れずに。あとはAWSコンソールでIAMにDynamoDBへアクセスするためのロールを作成すればOKです。AWS SDKのSTSインスタンスに対して作成したロールのarnをassumeRoleメソッドで渡してあげればクレデンシャル情報を取得できます。このarnをどこに保管しておくかも方法は色々ありますが、自分はSSMに保管してみました。

  const ssm = new SSM();
  const parameter = await ssm
    .getParameter({
      Name: SSM_PATH,
      WithDecryption: false,
    })
    .promise();

  const sts = new STS();
  const roleResponse = await sts
    .assumeRole({
      RoleArn: parameter.Parameter.Value,
      RoleSessionName: "TEST",
    })
    .promise();

こんな感じですね。