ドハマリしたので覚書。
やりたいこと
AWS.config.update
でAWSへのアクセスキーをセットしたい。
-> STSのassumeRoleでクロスアカウントアクセスしたかった。
よく見るコード
AWS.config.update({
accessKeyId: "AccessKeyId",
secretKey: "SecretAccessKey",
region: "region"
})
起きたこと
.envrc
に設定しているprofileが勝って、意図したアカウントにつながらない。
アカウントが変わっているかを確認する方法
こんな感じでaccess keyが変わっているか確認すれば良い。
console.log(AWS.config.credentials.accessKeyId)
AWS.config.update({
accessKeyId: "AccessKeyId",
secretKey: "SecretAccessKey",
region: "region"
})
console.log(AWS.config.credentials.accessKeyId)
意図したとおりに動いたコード
AWS.config.update({
credentials: new AWS.Credentials(
"AccessKeyId",
"SecretAccessKey"
),
region: "region"
})
AWS.Credentials
をインスタンス化して入れる方法だと動く。
そもそもの問題
https://github.com/aws/aws-sdk-js/blob/master/lib/config.d.ts#L192-L209 を見ると、よく見かけるコードの方は非推奨扱いになっている。
export abstract class ConfigurationOptions {
/**
* AWS access key ID.
*
* @deprecated
*/
accessKeyId?: string
/**
* AWS secret access key.
*
* @deprecated
*/
secretAccessKey?: string
/**
* AWS session token.
*
* @deprecated
*/
sessionToken?: string
STSでクロスアカウントアクセスするコード
こうすればよさそう。
const AWS = require('aws-sdk')
const arn = 'arn:aws:iam::9999999:role/EXAMPLE'
const sts = new AWS.STS()
sts.assumeRole({
RoleArn: arn,
RoleSessionName: 'test'
}).promise().then(data => {
AWS.config.update({
credentials: new AWS.Credentials(
data.Credentials.AccessKeyId,
data.Credentials.SecretAccessKey,
data.Credentials.SessionToken
),
region: 'us-west-2'
})
const docClient = new AWS.DynamoDB.DocumentClient()
return docClient.get({
TableName: 'Test',
Key: {
ID: 'hello'
}
}).promise()
})
.then(data => console.log(data))
.catch(e => console.log(e))