いわゆる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();
こんな感じですね。