You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CloudFormation创建带AssumeRole权限的IAM用户时出现语法错误求助

问题排查:CloudFormation IAM策略语法错误

问题描述

需创建具备AssumeRole权限的IAM用户,uat环境切换至账号123451234512的角色,stg环境切换至账号123451234513的角色,根据环境参数匹配对应AccountId。部署CloudFormation模板时触发IAM策略语法错误:

Resource handler returned message: "Syntax errors in policy. (Service: Iam, Status Code: 400, Request ID: 8c2edcc6-0050-424a-8d3f-585102asd1t)" (RequestToken: 45930d92-bb77-c55a-c02a-06529728afs, HandlerErrorCode: InvalidRequest)

错误原因

问题出在Policy02的Resource字段:!Sub函数内部嵌套FindInMap时多写了一个!符号。正确写法是在!Sub的变量引用中直接使用FindInMap函数,无需额外添加!。

错误代码片段:

Resource: !Sub arn:aws:iam::${!FindInMap [AccountMap, !Ref NetworkEnvironment, AccountId]}:role/testbucket1209

修正后的完整代码

AWSTemplateFormatVersion: '2010-09-09'
Description: Create test User
Parameters:
  NetworkEnvironment:
    Description: test
    Type: String
    Default: uat
    AllowedValues:
      - uat
      - stg
      - prd

Mappings:
  AccountMap:
    uat:
      AccountId: "123451234512"
    stg:
      AccountId: "123451234513"
    prd:
      AccountId: "123451234514"

Resources:
  User01:
    Type: AWS::IAM::User
    DeletionPolicy: Retain
    Properties:
      Path: /
      UserName: !Sub ${NetworkEnvironment}-test-user
      Tags:
        - Key: Name
          Value: !Sub ${NetworkEnvironment}-asd
        - Key: Environment
          Value: !Sub ${NetworkEnvironment}

  Policy01:
    Type: AWS::IAM::Policy
    DeletionPolicy: Retain
    Properties:
      PolicyName: !Sub ${NetworkEnvironment}-test-policy
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Action:
              - logs:PutLogEvents
              - logs:GetLogEvents
            Resource: '*'
      Users:
        - !Ref User01

  Policy02:
    Type: AWS::IAM::Policy
    DeletionPolicy: Retain
    Properties:
      PolicyName: !Sub ${NetworkEnvironment}-test-assume-role
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Action: sts:AssumeRole
            Resource: !Sub arn:aws:iam::${FindInMap [AccountMap, !Ref NetworkEnvironment, AccountId]}:role/testbucket1209
      Users:
        - !Ref User01

验证说明

修正后,!Sub会正确解析FindInMap的返回值,生成格式合法的IAM角色ARN。部署时CloudFormation会根据NetworkEnvironment参数,从AccountMap映射中匹配对应账号ID并替换到ARN中,避免语法错误。

内容的提问来源于stack exchange,提问作者B A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:20:17