4 votes

AWS CDK - Comment transmettre la clé d'accès Secret et la clé secrète Id comme paramètres Env à un conteneur ?

J'utilise CDK pour construire notre infrastructure sur AWS. Je crée mon utilisateur IAM pour mes microservices afin qu'ils puissent communiquer avec les services AWS selon les politiques définies. Mon problème est que je n'arrive pas à obtenir la clé secrète et l'ID d'AWS et à les passer comme variable Env à mon conteneur. Voir ci-dessous :

Tout d'abord, je crée mon utilisateur IAM qui sera utilisé par mes microservices.

const user = new User(this, "user", {
  userName: `${myAppEnv}-api-iam-user`,
});

Deuxièmement, j'essaie de créer une clé d'accès.

const accessKey = new CfnAccessKey(this, "ApiUserAccessKey", {
      userName: user.userName,
});

const accessKeyId = new CfnOutput(this, "AccessKeyId", {
      value: accessKey.ref,
});

const accessKeySecret = new CfnOutput(this, "SecretAccessKeyId", {
      value: accessKey.attrSecretAccessKey,
});

Ensuite, je veux le passer comme une variable env.

const apiContainer = apiTaskDefinition.addContainer(containerId, {
      image: apiImage,
      environment: {
        APP_ENV: myAppEnv,
        AWS_ACCESS_KEY_ID: awsAccessKeyId.value || ":(",
        AWS_SECRET_ACCESS_KEY: awsSecretAccessKey.value || ":(",
        NOTIFICATIONS_TABLE_ARN: notificationsTableDynamoDBArn,
        NOTIFICATIONS_QUEUE_URL: notificationsQueueUrl,
      },
      cpu: 256,
      memoryLimitMiB: 512,
      logging: new AwsLogDriver({ streamPrefix: `${myAppEnv}-ec-api` }),
    });

Lorsque le déploiement de mon CDK se termine avec succès, je vois l'impression suivante :/

Outputs:
staging-ecstack.AccessKeyId = SOMETHING
staging-ecstack.SecretAccessKeyId = SOMETHINGsy12X21xSSOMETHING2X2

Avez-vous une idée de la façon dont je peux y parvenir ?

3voto

Nick Cox Points 1407

En règle générale, la création d'un utilisateur IAM n'est pas la meilleure solution. Il est préférable d'utiliser un rôle IAM. Avec le CDK, il créera un taskRole pour vous automatiquement lorsque vous instanciez le taskDefinition construire. Vous pouvez attribuer des permissions à d'autres constructions de votre pile à l'aide de divers outils de gestion des permissions. grant* méthodes comme décrit ici :

const taskDefinition = new ecs.Ec2TaskDefinition(stack, 'TaskDef');
const container = taskDefinition.addContainer('web', {
  image: ecs.ContainerImage.fromRegistry("apps/myapp"),
  memoryLimitMiB: 256,
});
// Grant this task role access to use other resources
myDynamodbTable.grantReadWriteData(taskDefinition.taskRole);
mySnsTopic.grantPublish(taskDefinition.taskRole);

0 votes

T

0 votes

E

1 votes

A

1voto

mchlfchr Points 2854

En bref, trouvez la réponse dans mon billet de blog ici : https://blog.michaelfecher.com/i-tell-you-a-secret-provide-database-credentials-to-an-ecs-fargate-task-in-aws-cdk

Pour expliquer un peu plus en détail votre problème :

  1. Évitez de créer des rôles IAM personnalisés et utilisez ceux qui sont générés par CDK. Ils sont alignés et utilisent le principe du moindre privilège. Dans mon billet de blog, la création manuelle de rôles IAM n'est pas nécessaire. Oui, je sais... Je dois le mettre à jour ;)
  2. Utilisez le grant* de la ressource correspondante, par ex. taskDefinition . Cela permettra de créer une déclaration de politique pour le rôle généré de 1)
  3. N'utilisez pas de variables d'environnement pour les secrets. Il y a beaucoup de ressources sur le web, qui vous disent pourquoi. L'une d'entre elles est celle-ci : https://security.stackexchange.com/questions/197784/is-it-unsafe-to-use-environmental-variables-for-secret-data En particulier, lorsque vous travaillez avec ECS, utilisez la fonction secrets dans la définition de la tâche (voir le billet de blog).
  4. Il semble que vous transmettez le jeton au lieu de la valeur secrète réelle. Cela ne fonctionne pas. Le jeton est résolu pendant synth / Génération de formations de nuages.
  5. Vous n'aurez pas besoin de la CfnOutput . Utilisez le passage direct de champs de type Stack -> Stack. Le site CfnOutput est vraiment quelque chose que vous devriez éviter, lorsque vous avez toutes les piles sous contrôle dans une application CDK. Cela n'a de sens que si vous voulez partager entre les applications CDK, qui sont des déploiements et des dépôts séparés.

Si qqch. n'est pas clair, n'hésitez pas à poser des questions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X