【问题标题】:Serverless Framework - Cannot generate IAM policy statement for Task state无服务器框架 - 无法为任务状态生成 IAM 策略语句
【发布时间】:2022-02-09 00:32:18
【问题描述】:

我正在尝试使用无服务器框架来部署一个调用几个 lambda 的步进函数。这是我的 serverless.yml:

    org: bizrob
    app: flexipod-2-queue
    service: flexipod-2-queue
    
    frameworkVersion: "2 || 3"
    
    custom:
      region: eu-west-1
    
    provider:
      name: aws
      runtime: nodejs14.x
    
    plugins:
      - serverless-step-functions
    
    functions:
      pullSqlSvr:
        handler: flexipod-2-queue/pullSqlSvrData.pullSqlSvr
        environment:
          REGION: ${self:custom.region}
          API_VERSION_S3: "2006-03-01"
          API_VERSION_SQS: "2012-11-05"
          SQS_QUEUE_URL: !Ref "MyQueue"
      sendToDataLake:
        handler: queue-2-datalake/sendToDataLake.sendBatchToQueue
        environment:
          REGION: ${self:custom.region}
          API_VERSION_S3: "2006-03-01"
          API_VERSION_SQS: "2012-11-05"
    
    stepFunctions:
      stateMachines:
        flexipodFlow:
          name: flexipodFlow
          definition:
            StartAt: pullSqlSvr
            States:
              pullSqlSvr:
                Type: Task
                Resource:
                  Fn::GetAtt:[pullSqlSvr, Arn]
                Next: sendToDataLake
              sendToDataLake:
                Type: Task
                Resource:
                  Fn::GetAtt:[sendToDataLake, Arn]
                End: true
    
    resources:
      Resources:
        MyQueue:
          Type: "AWS::SQS::Queue"
          Properties:
            QueueName: "flexipod"

当我运行无服务器部署时,我看到以下错误:

将 flexipod-2-queue 部署到 stage dev (us-east-1, “serverless-admin-2”提供程序)无法生成 IAM 策略声明 对于任务状态 { 类型:“任务”,资源:“Fn::GetAtt:[pullSqlSvr, Arn]', Next: 'sendToDataLake' } 无法生成 IAM 策略声明 对于任务状态 { 类型:“任务”,资源:“Fn::GetAtt:[sendToDataLake, Arn]',结束:真 }

× Stack flexipod-2-queue-dev 部署失败(72s) 环境: win32,节点 16.1.0,框架 3.0.0,插件 6.0.0,SDK 4.3.0 凭证:无服务器仪表板、“serverless-admin-2”提供程序 (https://app.serverless.com/bizrob/apps/flexipod-2-queue/flexipod-2-queue/dev/us-east-1/providers) 文档:docs.serverless.com 支持:forum.serverless.com 错误:github.com/serverless/serverless/issues

错误:CREATE_FAILED: FlexipodFlow (AWS::StepFunctions::StateMachine) 资源处理程序返回消息:“无效的状态机定义: 'SCHEMA_VALIDATION_FAILED:值不是有效的资源 ARN /States/pullSqlSvr/Resource,SCHEMA_VALIDATION_FAILED:值不是 /States/sendToDataLake/Resource' 处的有效资源 ARN(服务: AWSStepFunctions;状态码:400;错误代码:无效定义

请问有什么解决办法吗?

【问题讨论】:

    标签: amazon-web-services aws-lambda serverless-framework aws-step-functions


    【解决方案1】:

    这是一个 YAML 语法问题。 Fn::GetAtt:[pullSqlSvr, Arn] 被解析为字符串,而不是键值对。在最后一个冒号后添加一个空格,或使用!GetAtt 快捷方式。

    Resource:
      Fn::GetAtt:[pullSqlSvr, Arn] # string :(
      Fn::GetAtt: [pullSqlSvr, Arn] # key-value :)
      !GetAtt pullSqlSvr.Arn # alternative shorthand intrinsic function :)
    

    【讨论】:

      【解决方案2】:

      根据我的经验,如果Steps 块中的任何键以小写字母开头,serverless-step-functions 将无法正确部署。将其更改为看似区分大小写的等效项,如下所示,然后重新部署可能会奏效:

      States:
        PullSqlSvr:
          Type: Task
          Resource:
            Fn::GetAtt:[pullSqlSvr, Arn]
          Next: sendToDataLake
        SendToDataLake:
          Type: Task
          Resource:
            Fn::GetAtt:[sendToDataLake, Arn]
          End: true
      

      (我刚刚将pullSqlSvrsendToDataLake 转换为它们的PascalCase 等效项PullSqlSvrSendToDataLake。)

      【讨论】:

      • 恐怕这没什么区别
      猜你喜欢
      • 2023-01-19
      • 1970-01-01
      • 2019-05-21
      • 2019-12-23
      • 2020-10-31
      • 2020-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多