CloudFormation UserData复制S3文件到Apache失败提示无法找到凭证
问题定位
fatal error: Unable to locate credentials报错与AWS CLI本地profile配置无关,属于CloudFormation模板配置缺失导致的实例无权限问题,具体错误点有两处:
- 核心配置缺失:你定义的
WebAppLaunchConfig(AutoScaling启动配置)没有绑定提前创建的ProfileWithRolesForOurAppIAM实例配置文件,EC2实例启动后不会挂载你配置了S3只读权限的IAM角色,AWS CLI运行时自然找不到可用的访问凭证。 - 权限语法错误:IAM角色的S3操作前缀大小写错误,IAM的服务操作命名要求全小写,你写的
S3:List*、S3:Get*属于无效权限规则,就算绑定了实例角色,后续也会抛出权限不足错误。
修复方案
1. 修正IAM角色的权限语法
将S3相关操作的前缀改为全小写s3:,修正后的角色配置片段如下:
SRS3ReadOnlyEC2: Type: "AWS::IAM::Role" Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: ec2.amazonaws.com Action: "sts:AssumeRole" Path: / Policies: - PolicyName: WebServersS3ReadRole PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - "s3:List*" - "s3:Get*" Resource: "*"
2. 给启动配置绑定实例配置文件
在WebAppLaunchConfig的Properties块中新增IamInstanceProfile属性,关联你创建的实例配置,同时给S3复制命令增加匿名访问参数兜底,避免实例角色权限生效延迟导致的执行失败,修正后的启动配置片段如下:
WebAppLaunchConfig: Type: AWS::AutoScaling::LaunchConfiguration Properties: # 新增:绑定包含S3访问权限的实例配置 IamInstanceProfile: !Ref ProfileWithRolesForOurApp UserData: Fn::Base64: !Sub | #!/bin/bash apt-get update -y apt-get install -y unzip awscli apache2 systemctl start apache2.service cd /var/www/html # 增加--no-sign-request参数,支持公开S3资源的匿名访问兜底 aws s3 cp s3://my-mini-site/index.html . --no-sign-request ImageId: ami-0729e439b6769d6ab KeyName: keyname SecurityGroups: - !Ref WebServerSecGroup InstanceType: t3.medium BlockDeviceMappings: - DeviceName: "/dev/sdk" Ebs: VolumeSize: '10'
补充说明:默认配置下的AWS CLI执行S3操作时,会按优先级查找环境变量、本地配置文件、实例元数据服务上的角色凭证,找不到任何可用凭证时会直接抛出错误,不会自动以匿名身份访问公开S3资源,这也是你明明配置了公开桶依然报凭证错误的原因。
内容的提问来源于stack exchange,提问作者Abarugo Goodness
相关产品推荐
相关产品推荐

