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