Tra*_*ler 7 credentials amazon-ecs aws-codepipeline aws-codebuild
我们正在处理为使用AWS CodePipeline构建并部署到ECS的应用程序提供构建时间和运行时机密的问题.
最终,我们的愿景是为每个应用程序创建一个通用管道,以实现以下目标:
以下是手头的问题:
除了一些警告:
我们已经考虑使用像credstash这样的工具来帮助管理凭据.此解决方案要求CodeBuild和ECS任务实例都能够使用AWS CLI.为了避免改组更多凭据,我们认为最好将特权角色分配给需要使用AWS CLI的实例.这样,CLI就可以从实例元数据中的角色推断凭据
考虑到这些限制,我们试图设法管理我们的秘密.对于每个应用程序,我们创建一个管道.使用Cloudformation模板,我们创建:
4资源:
3个角色:
CodePipeline的CodeBuild步骤假定CodeBuildRole允许它从凭证表中读取构建时间机密.CodeBuild然后构建项目并生成一个Docker Image,它将其推送到ECR.最后,部署步骤使用Cloudformation模板和项目公共存储库中存在的附带参数文件创建ECS服务ECS任务定义包括假设ECSTaskRole允许任务从凭证表读取运行时机密并提取所需图像来自ECR.
我们当前提出的解决方案存在以下问题:
是否有更成熟的方法来传递我们可能忽略的CodePipeline中的秘密,或者这是我们能得到的最好的方法?
三个想法:
AWS Secret Manager AWS Secrets Manager 可帮助您保护访问应用程序、服务和 IT 资源的机密。您可以在数据库凭证、API 密钥和其他机密的整个生命周期中轮换、管理和检索它们。
AWS 参数存储可以通过精细访问来保护访问密钥。此访问可以基于服务角色。
ECS 通过以下模式提供对 ServiceRole 的访问:
build:
commands:
- curl 169.254.170.2$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI | jq 'to_entries | [ .[] | select(.key | (contains("Expiration") or contains("RoleArn")) | not) ] | map(if .key == "AccessKeyId" then . + {"key":"AWS_ACCESS_KEY_ID"} else . end) | map(if .key == "SecretAccessKey" then . + {"key":"AWS_SECRET_ACCESS_KEY"} else . end) | map(if .key == "Token" then . + {"key":"AWS_SESSION_TOKEN"} else . end) | map("export \(.key)=\(.value)") | .[]' -r > /tmp/aws_cred_export.txt
- chmod +x /tmp/aws_cred_export.txt
- /aws_cred_export.txt && YOUR COMMAND HERE
Run Code Online (Sandbox Code Playgroud)
如果您提供给 CodeBuild 任务的 ServiceRole 有权使用参数存储密钥,那么您应该可以开始了。
狩猎愉快,希望这有帮助
| 归档时间: |
|
| 查看次数: |
1386 次 |
| 最近记录: |