web-dev-qa-db-fra.com

à l'aide d'un profil qui assume un rôle dans aws-sdk (AWS JavaScript SDK)

À l'aide du kit SDK AWS pour JavaScript, je souhaite utiliser un profil par défaut qui assume le rôle. Cela fonctionne parfaitement avec l'AWS CLI. L'utilisation de node.js avec le SDK n'assume pas le rôle, mais utilise uniquement les informations d'identification du compte AWS auquel appartient la clé d'accès. J'ai trouvé cette documentation mais elle ne traite pas d'assumer un rôle: http://docs.aws.Amazon.com/sdk-for-javascript/v2/developer-guide/loading-node-credentials- shared.html

Des conseils?

Voici mon fichier de configuration:

[default]
role_arn = arn:aws:iam::123456789:role/Developer
source_profile = default
output = json
region = us-east-1
15
Anders Lundsgard

La CLI et le SDK fonctionnent différemment, en ce que vous devez explicitement assumer le rôle lors de l'utilisation du SDK. Le SDK n'assume pas automatiquement le rôle de la configuration comme le fait la CLI.

Une fois le rôle assumé, AWS.config doit être mis à jour avec les nouvelles informations d'identification.

Cela fonctionne pour moi:

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

J'ai trouvé la bonne façon de le faire! Découvrez ce PR: https://github.com/aws/aws-sdk-js/pull/1391

Juste eu à ajouter AWS_SDK_LOAD_CONFIG="true" à la variable d'environnement avec AWS_PROFILE="assume-role-profile"

Il ne nécessite donc aucune mise à jour de code: sweat_smile:

ÉDITER:

En effet, le SDK charge uniquement le fichier credentials par défaut, pas le fichier config, mais comme aws role_arn est stocké dans le fichier config, nous devons activer le chargement du config également.

16
Kanak Singhal

La bonne façon d'utiliser plusieurs rôles multi-comptes dans le code:

Obtenez les informations d'identification pour le rôle de compte croisé avec sts et utilisez ces informations chaque fois que vous avez besoin d'obtenir un service authentifié avec ce rôle de compte croisé spécifique.

Exemple:

Créez une fonction pour obtenir les informations d'identification de compte croisé comme:

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,
        });
      }
    });
  });
}

Et puis vous pouvez l'utiliser sans problèmes comme:

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.
}

Avantages:

  • Ne modifie pas les informations d'identification globalement, vous pouvez donc toujours cibler votre propre compte AWS sans avoir à sauvegarder les informations d'identification à l'avance pour le restaurer.
  • Permet de contrôler exactement quel compte vous ciblez à chaque instant.
  • Permet de gérer plusieurs rôles et services multi-comptes.

Dans le mauvais sens:

NE PAS UTILISER AWS.config.update pour remplacer les informations d'identification globales AWS.config.credentials !!!

Remplacer les informations d'identification mondiales est une mauvaise pratique !! C'est la même situation que la solution approuvée @ Brant ici, mais ce n'est pas une bonne solution! Voici pourquoi:

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!!!
}

Problèmes:

  • Mise à jour globale AWS.config.credentials directement ou par AWS.config.update, remplacera les informations d'identification actuelles.
  • Tout indiquera ce rôle de compte croisé, même les futurs appels de service auxquels vous ne vous attendez pas.
  • Pour revenir au premier compte, vous devrez peut-être effectuer une sauvegarde temporaire AWS.config.credentials et le mettre à jour pour le restaurer. Il est difficile de contrôler lorsque vous utilisez chaque compte, il est difficile de tracer le contexte d'exécution et facile à gâcher en ciblant le mauvais compte.

Encore une fois, NE PAS UTILISER AWS.config.update pour remplacer les informations d'identification globales AWS.config.credentials !!!

Si vous devez exécuter le code entièrement dans un autre compte:

Si vous devez exécuter votre code entièrement pour un autre compte sans basculer entre les informations d'identification. Vous pouvez suivre les conseils de @Kanak Singhal et stocker le role_arn dans le fichier de configuration et ajouter AWS_SDK_LOAD_CONFIG="true" à la variable d'environnement avec AWS_PROFILE="assume-role-profile".

4
Facundo Victor