使用SAM为Lambda附加CloudFormationDescribeStacksPolicy失败求助
问题分析:SAM模板中Lambda附加CloudFormationDescribeStacksPolicy失败
问题场景
我尝试在SAM模板中为名为getEnvironment的Lambda函数附加CloudFormationDescribeStacksPolicy策略,模板配置如下:
getEnvironment: Type: AWS::Serverless::Function DependsOn: AppTable Properties: Handler: src/getEnvironment.handler Description: Get environment details Policies: - DynamoDBCrudPolicy: TableName: !Ref AppTable - CloudFormationDescribeStacksPolicy Events: ClientApi: Type: Api Properties: RestApiId: !Ref ClientApi Path: /environment Method: GET
部署失败,报错信息:
CREATE_IN_PROGRESS AWS::IAM::Role getEnvironmentRole ARN CloudFormationDescribeStacksPolicy is not valid. (Service: Iam, Status Code: 400, Request ID:
原因
SAM的预定义策略列表里根本没有CloudFormationDescribeStacksPolicy这个内置名称,IAM服务识别不了这个不存在的策略标识,所以抛出ARN无效的错误。你是误把自定义策略的命名逻辑套到了SAM预定义策略上,SAM并没有为CloudFormation的DescribeStacks操作单独提供简写的预定义策略。
解决方案
有两种可行的处理方式:
方式1:使用SAM内置的全量CloudFormation权限策略
如果你的Lambda确实需要完整的CloudFormation操作权限,可以直接替换成SAM官方提供的预定义策略:
Policies: - DynamoDBCrudPolicy: TableName: !Ref AppTable - CloudFormationFullAccess
方式2:自定义最小权限策略(推荐)
遵循IAM最小权限原则,只授予Lambda需要的DescribeStacks权限,配置如下:
Policies: - DynamoDBCrudPolicy: TableName: !Ref AppTable - Version: '2012-10-17' Statement: - Effect: Allow Action: cloudformation:DescribeStacks Resource: "*" # 可根据实际需求限制为特定栈ARN,比如!Sub "arn:aws:cloudformation:${AWS::Region}:${AWS::AccountId}:stack/${AWS::StackName}/*"
内容的提问来源于stack exchange,提问作者rambo
相关产品推荐
相关产品推荐

