AWS CDK架构下使用CodePipeline/CodeDeploy将S3文件同步到EC2指定目录
结论
不能直接在AppSpec的files字段中指定S3作为源实现该需求。CodeDeploy的AppSpec文件中files段的source仅支持指向本次部署包(即CodePipeline传递给CodeDeploy的构建产物压缩包)内的相对路径,不支持直接拉取外部S3存储桶的资源。
推荐实现方案
通过CodeDeploy生命周期钩子在部署完成后自动拉取S3配置,完全符合你不想将敏感配置纳入版本管理、避免手动SSH操作的要求,具体操作步骤如下:
- 第一步:调整EC2实例关联的IAM角色权限,添加对应S3存储桶的
s3:GetObject权限,确保实例有权限读取存储的配置文件。 - 第二步:在你的应用部署包根目录新增拉取配置的执行脚本,例如
pull_s3_config.sh,示例内容如下:
#!/bin/bash # 拉取.env文件到站点目录 aws s3 cp s3://<你的配置桶名称>/.env /path/to/webserverdir/.env # 拉取nginx配置到对应目录 aws s3 cp s3://<你的配置桶名称>/<你的nginx配置文件名> /etc/nginx/conf.d/<你的站点配置名>.conf # 可选:重载nginx使配置生效 systemctl reload nginx
- 第三步:修改
appspec.yml添加生命周期钩子配置,指定在部署的AfterInstall阶段执行上述脚本,修改后的配置示例:
files: - source: / destination: /path/to/webserverdir hooks: AfterInstall: - location: pull_s3_config.sh runas: root # 写入系统目录、重载服务需要root权限,可根据实际权限要求调整 timeout: 300
如果你是通过CDK管理整个架构,可以直接在CDK代码中完成IAM权限配置、AppSpec规则的声明,无需手动修改配置文件。如果不想把拉取配置的逻辑放到部署包中,也可以选择在CodePipeline中新增一个后置步骤,通过SSM Run Command向目标EC2实例下发拉取S3配置的命令,两种方案都可以实现需求,前者更轻量无需引入额外服务。
内容的提问来源于stack exchange,提问作者Juan Rangel
相关产品推荐
相关产品推荐

