À 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
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
});
}
});
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.
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:
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:
AWS.config.credentials
directement ou par AWS.config.update
, remplacera les informations d'identification actuelles.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"
.