AWS CDK - 如何将访问密钥秘密和秘密密钥 ID 作为环境参数传递给容器

oze*_*lan 5 amazon-ecs amazon-iam aws-cdk

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

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

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

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

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,
});
Run Code Online (Sandbox Code Playgroud)

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

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` }),
    });
Run Code Online (Sandbox Code Playgroud)

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

Outputs:
staging-ecstack.AccessKeyId = SOMETHING
staging-ecstack.SecretAccessKeyId = SOMETHINGsy12X21xSSOMETHING2X2
Run Code Online (Sandbox Code Playgroud)

你知道我该如何实现这一目标吗?

mch*_*chr 2

简而言之,请在我的博文中找到答案: https: //blog.michaelfecher.com/i-tell-you-a-secret-provide-database-credentials-to-an-ecs-fargate-task-in-aws -cdk

更详细地解释您的问题:

  1. 避免自定义创建 IAM 角色并使用 CDK 生成的角色。它们是一致的并使用最小特权原则。在我的博客文章中,手动创建 IAM 角色是不必要的。是的,我知道......我需要更新。;)
  2. 使用grant*相应资源的方法,例如taskDefinition。这将为生成的角色创建策略声明 1)
  3. 不要将环境变量用于机密。网络上有很多资源可以告诉您原因。其中之一是:https: //security.stackexchange.com/questions/197784/is-it-unsafe-to-use-environmental-variables-for-secret-data 特别是,在使用 ECS 时,请使用secrets参数在任务定义中(请参阅博客文章)。
  4. 看起来,您正在传递令牌而不是实际的秘密值。那是行不通的。令牌在synth/Cloud Formation 生成期间解析。
  5. 你将不需要CfnOutput. 使用直接堆栈 -> 堆栈传递字段。CfnOutput当在一个 CDK 应用程序中控制所有堆栈时,这确实是一件事,您应该避免这种情况。仅当您想在 CDK 应用程序之间共享(这些应用程序是独立的部署和存储库)时,这才有意义。

如果有不清楚的地方,请随时提问。