Python 3.x Python步骤函数API:get_activity_任务似乎总是超时
我有这样一个lambda函数: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 =
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。您可以在此处阅读有关阶跃函数限制的更多信息: