AWS SDK for JavaScriptを使用して、ロールを引き受けるデフォルトのプロファイルを使用します。これはAWS CLIで完全に機能します。 SDKでnode.jsを使用することはロールを引き受けませんが、アクセスキーが属するAWSアカウントへの認証情報のみを使用します。私はこのドキュメントを見つけましたが、役割を引き受けることに対処していません: http://docs.aws.Amazon.com/sdk-for-javascript/v2/developer-guide/loading-node-credentials- shared.html
任意のヒント?
これは私の設定ファイルです:
[default]
role_arn = arn:aws:iam::123456789:role/Developer
source_profile = default
output = json
region = us-east-1
CLIとSDKの動作は異なります。SDKを使用する場合、明示的に役割を引き受ける必要があります。 SDKは、CLIのように構成から自動的に役割を引き継ぎません。
ロールを引き受けた後、AWS.configを新しい認証情報で更新する必要があります。
これは私のために働く:
var AWS = require('aws-sdk');
AWS.config.region = 'us-east-1';
var sts = new AWS.STS();
sts.assumeRole({
RoleArn: 'arn:aws:iam::123456789:role/Developer',
RoleSessionName: 'awssdk'
}, function(err, data) {
if (err) { // an error occurred
console.log('Cannot assume role');
console.log(err, err.stack);
} else { // successful response
AWS.config.update({
accessKeyId: data.Credentials.AccessKeyId,
secretAccessKey: data.Credentials.SecretAccessKey,
sessionToken: data.Credentials.SessionToken
});
}
});
正しい方法を見つけました!このPRをチェックしてください: https://github.com/aws/aws-sdk-js/pull/1391
AWS_SDK_LOAD_CONFIG="true"
とともに環境変数にAWS_PROFILE="assume-role-profile"
を追加する必要がありました
したがって、コードを更新する必要はありません:sweat_smile:
編集:
これは、SDKがcredentials
ファイルではなくconfig
ファイルのみをデフォルトでロードするためですが、aws role_arnはconfig
ファイルに格納されるため、config
ファイルも同様です。
コードで複数のクロスアカウントロールを使用する正しい方法:
Stsを使用してクロスアカウントロールの資格情報を取得し、その特定のクロスアカウントロールで認証されたサービスを取得する必要があるたびに、それらの資格情報を使用します。
例:
次のようなクロスアカウント認証情報を取得する関数を作成します。
const AWS = require('aws-sdk');
const sts = new AWS.STS();
const getCrossAccountCredentials = async () => {
return new Promise((resolve, reject) => {
const timestamp = (new Date()).getTime();
const params = {
RoleArn: 'arn:aws:iam::123456789:role/Developer',
RoleSessionName: `be-descriptibe-here-${timestamp}`
};
sts.assumeRole(params, (err, data) => {
if (err) reject(err);
else {
resolve({
accessKeyId: data.Credentials.AccessKeyId,
secretAccessKey: data.Credentials.SecretAccessKey,
sessionToken: data.Credentials.SessionToken,
});
}
});
});
}
そして、次のような問題なく使用できます。
const main = async () => {
// Get the Cross account credentials
const accessparams = await getCrossAccountCredentials();
// Get the ec2 service for current account
const ec2 = new AWS.EC2();
// Get the ec2 service for cross account role
const ca_ec2 = new AWS.EC2(accessparams);
// Get the autoscaling service for current account
const autoscaling = new AWS.AutoScaling();
// Get the autoscaling service for cross account role
const ca_autoscaling = new AWS.AutoScaling(accessparams);
// This will describe instances within the cross account role
ca_ec2.describeInstances(...)
// This will describe instances within the original account
ec2.describeInstances(...)
// Here you can access both accounts without issues.
}
利点:
間違った方法:
AWS.config.update
を使用してグローバル資格情報を上書きしないでくださいAWS.config.credentials
!!!
グローバル資格情報をオーバーライドするのは悪い習慣です!!これは@Brantの承認済みソリューションと同じ状況ですが、良いソリューションではありません!その理由は次のとおりです。
const main = async () => {
// Get the Cross account credentials
const accessparams = await getCrossAccountCredentials();
// Get the ec2 service for current account
const ec2 = new AWS.EC2();
// Overwrite the AWS credentials with cross account credentilas
AWS.config.update(accessparams);
// Get the ec2 service for cross account role
const ca_ec2 = new AWS.EC2();
// This will describe instances within the cross account role
ca_ec2.describeInstances(...)
// This will ALSO describe instances within the cross account role
ec2.describeInstances(...)
// WARNING: Here you only will access the cross account role. You may get
// confused on what you're accessing!!!
}
問題点:
AWS.config.credentials
を直接またはAWS.config.update
で更新すると、現在の資格情報が上書きされます。AWS.config.credentials
を一時的にバックアップし、再度更新して復元する必要がある場合があります。各アカウントを使用するタイミングを制御するのは難しく、実行コンテキストをトレースするのは難しく、間違ったアカウントをターゲットとすることで簡単に混乱させることができます。繰り返しますが、AWS.config.update
を使用してグローバル資格情報を上書きしないでくださいAWS.config.credentials
!!!
コードを完全に別のアカウントで実行する必要がある場合:
資格情報を切り替えることなく、別のアカウントでコードを完全に実行する必要がある場合。 @Kanak Singhalのアドバイスに従い、role_arnを構成ファイルに保存し、AWS_SDK_LOAD_CONFIG="true"
とともにAWS_PROFILE="assume-role-profile"
を環境変数に追加します。