web-dev-qa-db-ja.com

aws-sdk(AWS JavaScript SDK)でロールを引き受けるプロファイルを使用する

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
15

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
    });
  }
});
16
Brant

正しい方法を見つけました!この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ファイルも同様です。

16
Kanak Singhal

コードで複数のクロスアカウントロールを使用する正しい方法

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アカウントをターゲットにできます。
  • どんなアカウントをターゲットにしているのかを正確に制御できます。
  • 複数のクロスアカウントの役割とサービスを処理できます。

間違った方法

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"を環境変数に追加します。

4
Facundo Victor