【发布时间】:2020-05-28 21:11:18
【问题描述】:
我正在尝试为工作流设置状态机,但对于我的生活,我似乎无法让它工作,这是我的 SAM 模板:
AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Description: >
strest
Sample SAM Template for strest
Globals:
Function:
Timeout: 3
Resources:
PublicApi:
Type: AWS::Serverless::Api
Properties:
StageName: Prod
# TracingEnabled: true
DefinitionBody:
swagger: "2.0"
info:
version: "1.1"
title: "StrestApi"
schemes:
- "http"
paths:
/start: # api gateway invokes lambda synchronously, which in turn invokes the stepfunction and waits for its final result
get:
produces:
- "application/json"
responses:
"200":
description: "200 response"
schema:
$ref: "#/definitions/Empty"
headers:
Access-Control-Allow-Headers:
type: "string"
security: []
x-amazon-apigateway-integration:
responses:
default:
statusCode: "200"
headers:
Access-Control-Allow-Headers:
type: "'*'"
httpMethod: GET
type: aws_proxy
uri:
Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${StartFunction.Arn}/invocations
definitions:
Empty:
type: "object"
title: "Empty Schema"
# Role which allows step functions to invoke lambda functions
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:
- PolicyName: StatesExecutionPolicy
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- "lambda:InvokeFunction"
Resource: "*"
# LAMBDAS
StartFunction:
Type: AWS::Serverless::Function
Properties:
Description: Starts the state machine
CodeUri: dist/
Handler: start/start.handler
Runtime: nodejs12.x
Environment:
Variables:
STEP_FUNCTION_ARN: !Ref StepFunctionsStateMachine
Policies:
- Version: "2012-10-17"
Statement:
- Effect: "Allow" # step function permissions open for now
Action:
- states:*
Resource: "*"
Events:
ExecSFNResource:
Type: Api
Properties:
RestApiId: !Ref PublicApi
Path: /start
Method: GET
ExecutorFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: dist/
Handler: executor/executor.handler
Runtime: nodejs12.x
# Events:
# HelloWorld:
# Type: Api
# Properties:
# Path: /execute
# Method: get
# State machine
StepFunctionsStateMachine:
Type: AWS::StepFunctions::StateMachine
Properties:
RoleArn: !GetAtt [StatesExecutionRole, Arn]
DefinitionString: !Sub |-
{
"StartAt": "execute",
"Comment": "State machine for executing the strest main loop",
"States": {
"execute": {
"Type": "Task",
"Resource": "${ExecutorFunction.Arn}",
"Comment": "Run the Executor Lambda function",
"End": true
}
}
}
我要么通过sam local start-api 或sam local start-lambda 启动服务。
- 使用这些命令启动 api 有什么区别吗?
- 在我粘贴的模板中,我使用
!Ref来获取状态机ARN,但是这不起作用,返回相同的字符串,如果我将其更改为!GetAtt StepFunctionsStateMachine.Arn它可以工作 - 更改 2. 然后我查询
/start端点,start lambda 函数开始运行,我得到状态机的 arn,但是当我尝试启动它时,我得到一个Service not valid in this context: lambda错误(在标记之后2),这里是启动函数的代码:
import AWS from "aws-sdk";
export async function handler(event: any, context: any) {
let stepFunctionArn = process.env.STEP_FUNCTION_ARN;
console.log("marker0 stepFunctionArn", stepFunctionArn);
let params = {
stateMachineArn: stepFunctionArn!,
name: "Execution lambda " + new Date().toString()
};
console.log("marker 1");
let sf_client = new AWS.StepFunctions();
console.log("marker 2");
let res = await sf_client.startExecution(params).promise();
console.log("marker 3", res);
return {};
}
【问题讨论】:
标签: amazon-web-services serverless aws-sam aws-sam-cli