首页 > 解决方案 > AWS CDK - 如何将访问密钥密钥和密钥 ID 作为环境参数传递给容器

问题描述

我正在使用 CDK 在 AWS 上构建我们的基础设施。我为我的微服务创建了我的 IAM 用户,以便在定义的策略下与 AWS 服务通信。我的问题是我无法获取 aws 密钥和 id,然后将其作为 Env 变量传递给我的容器。见下文:

首先,我创建了我的 IAM 用户,我的微服务将使用该用户。

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

其次,我正在尝试创建访问密钥。

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

接下来,我想将它作为环境变量传递。

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

当我的 CDK 部署成功完成时,我看到打印出以下内容:/

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

你知道我怎么能做到这一点吗?

标签: amazon-iamamazon-ecsaws-cdk

解决方案


一般来说,创建一个 IAM 用户不是这里的方法 - 你最好使用 IAM 角色。使用 CDK,它会taskRole在您实例化taskDefinition构造时自动为您创建一个。您可以使用此处描述grant*的各种方法将权限分配给堆栈中的其他构造:

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

推荐阅读