Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python步骤函数API:get_activity_任务似乎总是超时_Python 3.x_Amazon Web Services_Timeout_Boto3_Aws Step Functions - Fatal编程技术网

Python 3.x Python步骤函数API:get_activity_任务似乎总是超时

Python 3.x Python步骤函数API:get_activity_任务似乎总是超时,python-3.x,amazon-web-services,timeout,boto3,aws-step-functions,Python 3.x,Amazon Web Services,Timeout,Boto3,Aws Step Functions,我有这样一个lambda函数: import boto3 import os import json step_functions = boto3.client('stepfunctions') workers_topic = boto3.resource('sns').Topic(os.environ.get("WORKERS_TOPIC_ARN")) def test_push_to_workers_sns(event, context): activity_response =

我有这样一个lambda函数:

import boto3
import os
import json

step_functions = boto3.client('stepfunctions')
workers_topic = boto3.resource('sns').Topic(os.environ.get("WORKERS_TOPIC_ARN"))

def test_push_to_workers_sns(event, context):
    activity_response = \
        step_functions.get_activity_task(
            activityArn=os.environ.get("ACKNOWLEDGE_ACTIVITY_ARN"),
            workerName='test_push_to_workers_sns'
        )

    task_token, input_ = activity_response['taskToken'], activity_response['input']

    print(f"Task token is {task_token}")
    print(f"Input is {input}")

    if not task_token:
        print("No activity found")
        return

    workers_topic.publish(Message="blah blah")

当我开始执行我拥有的step函数并且它到达“活动”时,我反复检查在我的终端上运行aws stepfunctions get activity task-activity arn是否返回了一个都正确的taskToken和输入。但是,无论活动是否正在运行,此lambda函数似乎总是超时。我已将lambda函数的超时值设置为1分钟15秒,并且步骤函数的超时时间为1小时时的活动状态。我使用以下CloudFormation模板检查了此情况,它可以正常工作:

AWSTemplateFormatVersion: "2010-09-09"
Description: Stack creating AWS Step Functions state machine and lambda function calling GetActivityTask.

Resources:
  LambdaFunction:
    Type: AWS::Lambda::Function
    Properties:
      Handler: "index.handler"
      Role: !GetAtt LambdaExecutionRole.Arn
      Code:
        ZipFile: |
          import boto3
          import os
          import json

          step_functions = boto3.client('stepfunctions')
          workers_topic = boto3.resource('sns').Topic(os.environ.get("WORKERS_TOPIC_ARN"))


          def handler(event, context):
              activity_response = step_functions.get_activity_task(
                  activityArn=os.environ.get("ACKNOWLEDGE_ACTIVITY_ARN"),
                  workerName='test_push_to_workers_sns'
              )

              if 'taskToken' not in activity_response:
                  return

              task_token, task_input = activity_response['taskToken'], activity_response['input']

              print(f"Task token is {task_token}")
              print(f"Input is {input}")

              workers_topic.publish(Message="blah blah")
              step_functions.send_task_success(
                  taskToken=task_token,
                  output=task_input
              )

      Runtime: "python3.6"
      Timeout: 25
      Environment:
        Variables:
          WORKERS_TOPIC_ARN: !Ref WorkersTopic
          ACKNOWLEDGE_ACTIVITY_ARN: !Ref AcknowledgeActivity

  StateMachine:
    Type: AWS::StepFunctions::StateMachine
    Properties:
      RoleArn: !GetAtt StatesExecutionRole.Arn
      DefinitionString: !Sub
        - >
          {
            "Comment": "State Machine for GetActivityTask testing purposes.",
            "StartAt": "FirstState",
            "States": {
              "FirstState": {
                "Type": "Task",
                "Resource": "${ACKNOWLEDGE_ACTIVITY_ARN}",
                "End": true
              }
            }
          }
        - ACKNOWLEDGE_ACTIVITY_ARN: !Ref AcknowledgeActivity

  AcknowledgeActivity:
    Type: AWS::StepFunctions::Activity
    Properties:
      Name: !Sub ${AWS::AccountId}-AcknowledgeActivity

  WorkersTopic:
    Type: AWS::SNS::Topic

  LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
        - Effect: Allow
          Principal:
            Service:
              - lambda.amazonaws.com
          Action:
            - sts:AssumeRole
      Path: "/"
      Policies:
        - PolicyName: StepFunctionsAccess
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - states:GetActivityTask
                  - states:SendTaskFailure
                  - states:SendTaskSuccess
                Resource: arn:aws:states:*:*:*
        - PolicyName: SNSAccess
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - SNS:Publish
                Resource: arn:aws:sns:*:*:*

  StatesExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - !Sub states.${AWS::Region}.amazonaws.com
            Action: sts:AssumeRole
      Path: "/"
      Policies: []
我从步骤函数控制台手动创建了执行,并从Lambda控制台手动执行Lambda

请记住,在使用GetActivityTask获取taskToken之后,与之相关的执行将等待响应SendTaskSuccess或SendTaskFailure,直到它达到超时。默认值非常长。所以,如果您之前已经使用了令牌,那么该执行对于GetActivityTask不可用。您可以在步骤函数控制台中查找执行状态,查看特定执行的事件

从GetActivityTask获取令牌后,应该从代码中调用SendTaskSuccess或SendTaskFailure,否则执行将挂起,直到达到超时或停止

除了最初的问题:GetActivityTask不是设计用来从Lambda调用的。您可以将Lambda函数作为资源传递给状态机,而不是活动,当执行达到指定状态时将调用它。处理程序中的事件将包含执行状态。活动应仅用于专用机器EC2、ECS上的长时间运行作业。我还应该指出,GetActivityTask调用有服务限制,25个RPS的bucket大小为1000,基于Lambda的状态基本上只受每秒400个transition count limit的限制,bucket大小为800。您可以在此处阅读有关阶跃函数限制的更多信息: