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

Serverless部署报错:无法生成Task状态的IAM策略语句

解决Serverless Step Functions部署错误及IAM权限问题

问题背景

使用以下Serverless模板部署Step Functions时:

service: demo-step-function
frameworkVersion: '3'
plugins:
  - serverless-step-functions

package:
  individually: true

provider:
  name: aws
  runtime: nodejs14.x
  memorySize: 256
  stage: ${opt:stage, "dev"}
  iamRoleStatements:
    - Effect: "Allow"
      Action:
        - s3:PutObject
        - s3:GetObject
      Resource: !Join ["/", [!GetAtt MainS3Bucket.Arn, "*"]]
    - Effect: Allow
      Action:
        - "dynamodb:*"
      Resource:
        Fn::GetAtt: [MarginTable, Arn]

resources: 
  - ${file(./infra/dynamodb.yml)}
  - ${file(./infra/s3.yml)}

functions:
  # function definitions goes here
  #   handler: global-aggregation.hello

stepFunctions:
  stateMachines:
    MainStateMachine:
      name: my-custom-step-function-main-${self:custom.currentEnv}
      type: EXPRESS
      events:
        - http:
            path: update
            method: POST
            action: StartSyncExecution
            cors: true
            request:
              template:
                application/json: |
                  #set( $body = $util.escapeJavaScript($input.json('$')) )
                  {
                    "input": "$body",
                    "stateMachineArn": "arn:aws:states:${self:provider.region}:${aws:accountId}:stateMachine:my-custom-step-function-main-${self:custom.currentEnv}"
                  }
            response:
              template:
                application/json: |
                  #set($inputRoot = $input.path('$'))
                  $inputRoot.output
      definition:
        StartAt: CreateBatches
        States:
          CreateBatches:
            Type: Task
            Next: RunBatches
            Resource:
              Fn::GetAtt: [CreateBatches, Arn]
          RunBatches:
            Type: Map
            Next: GlobalAggregation
            ItemsPath: $.batch_index
            Parameters:
              batch_id.$: $$.Map.Item.Value
              s3_bucket.$: $.s3_bucket
              s3_key.$: $.s3_key
              rest_input.$: $
            Iterator:
              StartAt: GetBatch
              States:
                GetBatch:
                  Type: Task
                  Next: RunWorkerStateMachine
                  Resource:
                    Fn::GetAtt: [GetBatch, Arn]
                RunWorkerStateMachine:
                  Type: Task
                  End: true
                  Resource: arn:aws:states:::aws-sdk:sfn:startSyncExecution
                  Parameters:
                    Input:
                      batch_data.$: $.batch_data
                    StateMachineArn: arn:aws:states:${aws:region}:${aws:accountId}:stateMachine:my-custom-step-function-worker-${self:custom.currentEnv}
                  ResultSelector:
                    Output.$: States.StringToJson($.Output)
          GlobalAggregation:
            Type: Task
            End: true
            Resource:
              Fn::GetAtt: [GlobalAggregation, Arn]
    WorkerStateMachine:
      name: my-custom-step-function-worker-${self:custom.currentEnv}
      type: EXPRESS
      definition:
        StartAt: PassBatchData
        States:
          PassBatchData:
            Type: Pass
            InputPath: $.batch_data
            Next: ProcessBatch
          ProcessBatch:
            Type: Map
            Next: LocalAggregation
            ItemsPath: $.propertyIds
            Parameters:
              propertyIds.$: $$.Map.Item.Value
              index.$: $$.Map.Item.Index
            Iterator:
              StartAt: MainLambda
              States:
                MainLambda:
                  Type: Task
                  End: true
                  Resource:
                    Fn::GetAtt: [MainLambda, Arn]
          LocalAggregation:
            Type: Task
            End: true
            Resource: 
              Fn::GetAtt: [LocalAggregation, Arn]

执行sls deploy时出现错误:

Cannot generate IAM policy statement for Task state { Type: 'Task',
  End: true,
  Resource: 'arn:aws:states:::aws-sdk:sfn:startSyncExecution',
  Parameters:
   { Input: { 'batch_data.$': '$.batch_data' },
     StateMachineArn: 'arn:aws:states:ap-south-1:244730046330:stateMachine:margin-dynamodb-sf-worker-sm-dev' },
  ResultSelector: { 'Output.$': 'States.StringToJson($.Output)' } }

问题1:错误原因解析

这个错误是因为Serverless Step Functions插件无法自动为AWS SDK类型的Task资源生成对应的IAM权限策略。当你使用arn:aws:states:::aws-sdk:sfn:startSyncExecution这种调用其他State Machine的SDK集成Task时,插件无法自动识别需要的states:StartSyncExecution动作以及对应的Worker State Machine资源ARN,导致无法生成合法的IAM策略语句,从而抛出部署错误。

问题2:手动配置IAM权限解决方法

要让主State Machine能够调用Worker State Machine,需要手动为其执行角色添加权限,同时修复插件无法自动生成策略的问题,具体步骤如下:

1. 补充自定义环境变量配置

首先在配置顶部添加custom字段,确保currentEnv变量能正确解析:

custom:
  currentEnv: ${opt:stage, 'dev'}

2. 为主State Machine添加IAM权限

在stepFunctions.stateMachines.MainStateMachine下添加iamRoleStatements,明确允许调用Worker State Machine的权限:

stepFunctions:
  stateMachines:
    MainStateMachine:
      # 原有配置保持不变
      iamRoleStatements:
        - Effect: Allow
          Action:
            - states:StartSyncExecution
          Resource: arn:aws:states:${aws:region}:${aws:accountId}:stateMachine:my-custom-step-function-worker-${self:custom.currentEnv}
      # 原有definition等配置保持不变

3. 重新部署

完成上述修改后,执行sls deploy即可正常部署,此时主State Machine的执行角色会包含调用Worker State Machine的权限,插件也不会再抛出无法生成IAM策略的错误。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:10:28