执行sam package命令报错:CodeUri工件上传失败且S3权限被拒
问题分析与解决方案
看起来你遇到了两个关联的问题:SAM找不到函数代码的位置,以及S3上传权限被拒绝。咱们一步步来解决:
1. 修复CodeUri缺失导致的Artifact None错误
你的template.yml里的HelloWorldFunction资源缺少了CodeUri配置,这是SAM函数资源的必填参数之一,用来指定函数代码所在的本地目录或压缩包路径。SAM在打包时会读取这个路径下的代码,上传到指定的S3桶中。
修改你的template.yml,在Properties块中添加CodeUri:
AWSTemplateFormatVersion : '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs8.10 CodeUri: ./ # 指向index.js所在的本地目录(和template.yml同目录的话用./即可)
2. 排查S3 PutObject AccessDenied错误
虽然你提到IAM用户拥有AmazonS3FullAccess权限,但还是有几个常见原因会导致这个错误:
- CLI凭证不匹配:确认当前AWS CLI使用的是你配置了权限的IAM用户凭证。运行命令
aws configure list查看当前生效的Access Key ID和Region,确保和你预期的一致。 - S3桶区域不匹配:如果你的S3桶创建在某个特定Region(比如
us-west-2),但CLI默认配置的Region不同,可能会导致跨区域访问权限问题。可以在sam package命令中显式指定桶的Region:sam package \ --template-file template.yml \ --output-template-file package.yml \ --s3-bucket brian-test-sam \ --region <你的桶所在区域> - S3桶策略限制:检查桶的自定义策略,是否存在拒绝该IAM用户执行
PutObject操作的规则。默认情况下,IAM的AmazonS3FullAccess权限会覆盖桶策略,但如果桶策略有明确的拒绝规则,会优先生效。
先解决CodeUri的问题,再重新运行sam package命令,很多时候第一个错误修复后,第二个权限问题也会随之消失(因为SAM现在有了正确的文件要上传)。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

