SAM模板已声明S3桶却未成功创建,如何调整模板实现S3桶创建?
解决方案
问题原因
你当前使用的SAM模板仅声明了Lambda函数资源,未显式定义代码存储所需的S3桶资源,因此CloudFormation执行部署时不会自动创建该桶。
修改后完整SAM模板
你需要在Resources段新增S3桶资源定义,同时调整Lambda的配置引用新建的桶,示例如下:
Parameters: # 补充你用到的参数定义,避免部署报错 ApplicationId: Type: String env: Type: String SecurityGroup: Type: CommaDelimitedList VPCSubnetId: Type: CommaDelimitedList Resources: # 新增S3桶资源定义 LambdaCodeS3Bucket: Type: AWS::S3::Bucket Properties: # 桶名加入账号ID、环境等标识,符合S3全局唯一命名要求 BucketName: !Sub '${ApplicationId}-${env}-lambda-code-bucket-${AWS::AccountId}' # 可选配置:开启默认加密、版本控制 BucketEncryption: ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: SSEAlgorithm: AES256 VersioningConfiguration: Status: Enabled ProducerLambda: Type: 'AWS::Serverless::Function' DependsOn: LambdaCodeS3Bucket # 配置依赖,确保桶创建完成后再部署Lambda Properties: FunctionName: !Sub '${ApplicationId}-${env}-Producer-Lambda-${AWS::AccountId}-${AWS::Region}' Handler: index.handler Runtime: nodejs14.x CodeUri: Bucket: !Ref LambdaCodeS3Bucket # 引用上面定义的S3桶 Key: s3bucketref.zip Role: !Sub 'arn:aws:iam::${AWS::AccountId}:role/Producer-lambda-trigger-role' VpcConfig: SecurityGroupIds: !Ref SecurityGroup SubnetIds: !Ref VPCSubnetId Environment: Variables: Region: !Sub '${AWS::Region}'
注意事项
- S3桶名要求全局唯一,建议命名规则中加入账号ID、环境标识等字段,避免重名部署失败
- 部署前需要将代码包
s3bucketref.zip上传到已创建的S3桶中,也可以使用sam package命令自动完成代码打包和上传操作 - 如果Lambda执行角色没有S3桶读取权限,需要在角色的权限策略中添加如下权限配置:
{ "Effect": "Allow", "Action": "s3:GetObject", "Resource": !Sub '${LambdaCodeS3Bucket.Arn}/*' }
内容的提问来源于stack exchange,提问作者Dhinesh
相关产品推荐
相关产品推荐

