aws:executeScript无法获取凭证问题求助
兄弟,我之前也碰到过一模一样的问题,给你捋清楚为啥Lambda能行但aws:executeScript不行,再给你几个解决办法:
首先得搞懂核心区别:Lambda函数是自带执行角色的,AWS会自动把这个角色的临时凭证注入到函数运行的环境变量里,你的Python代码调用boto3时会自动读取这些凭证,所以能正常访问S3。但SSM Automation的aws:executeScript步骤不一样——如果你的自动化文档没配置专属的执行角色,它并不会自动把调用者的角色凭证注入到脚本的运行容器里,这就是你拿到NoCredentialsError的原因。
下面是几个靠谱的解决办法,你可以根据自己的需求选:
给自动化文档配置执行角色(最推荐)
给你的SSM Automation文档指定一个IAM执行角色,这个角色需要满足两个条件:- 信任策略里允许
ssm.amazonaws.com作为信任实体(也就是允许SSM服务假定这个角色); - 拥有访问目标S3资源的权限(比如附加
AmazonS3ReadOnlyAccess策略,或者自定义更精细的权限)。
配置好之后,当你启动自动化执行时,aws:executeScript步骤会自动使用这个角色的临时凭证,你的Python代码就能像在Lambda里一样直接调用S3了。
配置方式:编辑自动化文档时,在「Execution role」字段填入这个角色的ARN;或者用CLI启动执行时加上--assume-role <角色ARN>参数。
- 信任策略里允许
在
aws:executeScript步骤显式指定要假定的角色
如果不想给整个文档配置执行角色,也可以单独在aws:executeScript步骤里指定AssumeRole参数,让脚本直接使用这个角色的凭证运行。
比如在你的自动化文档的步骤里这么写:action: aws:executeScript inputs: Runtime: python3.9 Script: | import boto3 s3 = boto3.client('s3') # 这里写你的S3操作逻辑,比如列出桶内容 response = s3.list_buckets() print(response) AssumeRole: arn:aws:iam::123456789012:role/YourExistingRoleWithS3Access注意:这里指定的角色需要信任启动自动化的调用者角色(也就是你的IAM用户/角色),否则会报错无法假定角色。
检查代码是否硬编码了无效凭证
最后再确认下你的Python代码,别手动指定了错误的凭证信息。确保是直接用boto3.client('s3')创建客户端,没有写死aws_access_key_id和aws_secret_access_key,这样boto3才会自动去读取环境变量里的临时凭证。
你可以先试试第一个方法,配置执行角色是最规范的方式,一般都能解决问题。
内容来源于stack exchange

