AWS CodeDeploy访问S3出现权限拒绝错误求助
先把你遇到的错误信息贴出来,方便精准定位:
2018-04-20 16:52:35 INFO [codedeploy-agent(2983)]: [Aws::CodeDeployCommand::Client 200 0.023779 0 retries] put_host_command_complete(command_status:"Failed",diagnostics:{format:"JSON",payload:"{"error_code":5,"script_name":"","message":"Access Denied","log":""}"},host_command_identifier:"WyJjb20uYW1hem9uLmFwb2xsby5kZXBsb3ljb250cm9sLmRvbWFpbi5Ib3N0Q29tbWFuZElkZW50aWZpZXIiLHsiZ...
我之前碰到过一模一样的问题,CodeDeploy的错误码5基本就是资源访问权限受阻的信号,咱们从这几个方向一步步排查:
1. 检查EC2实例的IAM角色权限
如果是用EC2实例部署,CodeDeploy Agent是通过实例绑定的IAM角色来访问S3的,这个角色必须具备访问目标桶的核心权限:
- 至少要包含
s3:GetObject(拉取部署包)和s3:ListBucket(遍历桶内文件)的权限 - 给你个可直接复用的策略模板,记得把
<your-bucket-name>换成你的实际桶名:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::<your-bucket-name>", "arn:aws:s3:::<your-bucket-name>/*" ] } ] }
注意:要把这个策略附加到EC2实例的IAM角色上,不是随便给某个IAM用户哦。
2. 排查S3存储桶的桶策略
有时候即使IAM角色有权限,桶策略里的Deny规则会直接覆盖允许权限:
- 打开S3控制台,找到目标桶,进入「权限」-「桶策略」页面
- 检查有没有针对CodeDeploy服务、实例角色ARN的拒绝语句,如果有,要么删除要么调整为允许规则
- 也可以直接在桶策略里明确允许实例角色访问,示例如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<your-account-id>:role/<your-ec2-instance-role>" }, "Action": [ "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::<your-bucket-name>", "arn:aws:s3:::<your-bucket-name>/*" ] } ] }
3. 检查S3桶的KMS加密设置
如果你的S3桶启用了KMS服务器端加密,那实例角色还需要额外的KMS解密权限:
- 给实例角色附加包含
kms:Decrypt权限的策略,目标资源是你用来加密桶的KMS密钥ARN - 示例策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "kms:Decrypt", "Resource": "arn:aws:kms:<region>:<account-id>:key/<key-id>" } ] }
4. 升级CodeDeploy Agent版本
旧版本的Agent可能存在兼容性问题,导致权限验证逻辑出错:
- 对于Ubuntu/Debian系统,执行升级命令:
sudo apt-get update && sudo apt-get install codedeploy-agent
- 对于CentOS/RHEL系统,执行升级命令:
sudo yum update codedeploy-agent
升级完成后记得重启Agent:sudo service codedeploy-agent restart
按照这几步排查下来,我当时很快就解决了Access Denied的问题,你可以挨个试试!
内容的提问来源于stack exchange,提问作者Stephen

