我有一些奇怪的错误,我无法找出原因,你能帮助我吗?
...
无服务器:警告:无法找到名为:TypeScriptPlugin
无服务器:根配置错误:无法识别的属性“stepFunctions”
...
无服务器.yml
service:
name: service-name
plugins:
- serverless-localstack
- serverless-step-functions
- serverless-pseudo-parameters
- serverless-webpack
custom:
webpackIncludeModules: true
localstack:
stages:
- local
host: http://localhost
edgePort: 4566
autostart: true
lambda:
mountCode: false
debug: true
docker:
sudo: true
provider:
configValidationMode: off
deploymentBucket:
name: local
name: aws
runtime: nodejs12.x
stage: ${opt:stage, "dev"}
region: ${env:AWS_REGION, "us-east-1"}
logRetentionInDays: 30
functions:
...
stepFunctions:
...
Run Code Online (Sandbox Code Playgroud)
包.json
{
"name": "service-name",
"version": "0.119.0",
"description": "Service decription.",
"scripts": {
"test": "echo \"Error: no test specified\" && exit …Run Code Online (Sandbox Code Playgroud) amazon-web-services aws-step-functions serverless localstack
我有一个具有并行状态的步进函数,该函数有四个分支(A、B、C、D),每个分支都有 3 个 Glue StartJobRun 任务状态。如果分支 A 在第一个任务期间失败,我如何确保其他分支在成功后继续执行其任务?
我有以下管道:
我在将源 (GitHub) 阶段的输出工件链接到 StepFunctions 阶段的输入工件时遇到问题。
我的目标是让 StepFunctions 阶段能够访问源阶段输出到的最后一个 zip 文件名(在 S3 存储桶上)。
我已经尝试过:
在 Source 阶段定义命名空间以在 StepFunctions 阶段使用它。链接到文档:https://docs.aws.amazon.com/codepipeline/latest/userguide/reference-variables.html
阅读此文档:https://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-step-functions.html
新案例:使用 Lambda 代替 StepFunctions 进行阶段,它从源阶段接收到 S3 文件夹和其他元数据的链接,而 StepFunctions 则不会。
github amazon-web-services devops aws-codepipeline aws-step-functions
我使用 AWS Step 函数编排了数据管道。在最后一个状态中,我想发送自定义通知。我正在使用内部函数 States.Format 来格式化我的消息和主题。它适用于 Context 对象元素。在这里,我在 Message 参数中测试了这一点。但它不适用于输入 JSON。这是我的输入 JSON { "job-param":{ "pipe-line-name":"我的管道名称", "other-keys":"其他值" } }
"Success State": {
"Type": "Task",
"Resource": "arn:aws:states:::sns:publish",
"Parameters": {
"Message.$": "States.Format('Execution Id:{}, completed successfully!', $$.Execution.Id)",
"Subject.$": "States.Format('[INFO] {} completed successfully!', $.job-param.pipe-line-name)",
"TopicArn": "arn:aws:sns:us-east-1:************:sns-topic"
},
"End": true
}
Run Code Online (Sandbox Code Playgroud)
保存此状态机时,它给出以下错误消息:
“Subject.$”字段的值必须是有效的 JSON 路径
我检查了输入和结果路径。他们有这个价值。我可以直接使用这个值作为参数。这工作正常。但我无法使用其他字符串进行格式化。
"Subject.$": "$.job-param.pipe-line-name"
Run Code Online (Sandbox Code Playgroud)
另一种方法是调用 lambda 来自定义并触发 SNS。但我想避免这种情况。
我可以请求一些建议来修复此错误吗?
提前致谢!
对于 StepFunctions,我们是否可以两者兼而有之Retry,并Catch在穷尽的情况下共同努力?
这是我的用例
"ExecuteMyJob": {
"Type": "Task",
"Resource": "arn:aws:states:::glue:startJobRun.sync",
"Parameters": {
"JobName.$": "$.jobName",
"Arguments.$": "$.jobArguments"
},
"Retry" : [{
"ErrorEquals": [ "States.TaskFailed", "States.Runtime" ],
"MaxAttempts": 3,
"IntervalSeconds": 60,
"BackoffRate": 2
}],
"Catch": [{
"ErrorEquals": [ "States.ALL" ],
"Next": "MarkJobFailOnDbTable"
}],
"Next": "NextJobOnPreviousSuccess"
}
Run Code Online (Sandbox Code Playgroud) 我已经在 Terraform 中定义了 StepFunction 状态机的创建,现在我想设置一个计时器来每天触发状态机,我认为使用 cloudwatch 事件规则可能是一个不错的选择,我知道如何设置事件规则来触发 Lambda :
resource "aws_cloudwatch_event_rule" "lambda_event_rule" {
name = xxx
schedule_expression = xxx
description = xxx
}
resource "aws_cloudwatch_event_target" "lambda_event_target" {
target_id = xxx
rule = aws_cloudwatch_event_rule.lambda_event_rule.name
arn = xxx
}
#I must setup the right permissions using 'aws_lambda_permission'
#see: https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_event_target
resource "aws_lambda_permission" "lambda_event_permission" {
statement_id = xxx
action = "lambda:InvokeFunction"
function_name = xxx
principal = "events.amazonaws.com"
source_arn = aws_cloudwatch_event_rule.lambda_event_rule.name
}
Run Code Online (Sandbox Code Playgroud)
但如何设置触发状态机的权限部分?我找不到任何关于它的例子,我错过了什么吗?是因为我们不需要状态机的权限配置吗?有人可以帮忙吗?
以下是到目前为止我使用 cloudwatch 事件规则触发状态机的内容:
resource "aws_cloudwatch_event_rule" "step_function_event_rule" {
name = xxx
schedule_expression = …Run Code Online (Sandbox Code Playgroud) state-machine amazon-web-services terraform aws-step-functions amazon-cloudwatch-events
Step Functions 现在支持回调功能以支持手动批准。我想知道任务令牌是如何生成的,以及我们是否可以传递自己的任务令牌字符串,以便我们不需要存储它来标记任务通过/失败。
此外,对于需要多个客户端交互才能进入下一个状态的工作流程,建议使用 Step Functions 或 SWF(及其信号)。
用例:我在工作流程中有多个步骤,如果计时器达到 6 个月,或者如果在这 6 个月内用户实际批准,则我们需要执行失败场景,那么工作流程需要执行到通过的场景。
我有一个对象数组,我想将其迭代传递给 Lambda 函数。但是,我还需要为我启动的每个 Lambda 函数运行一个 ECS 任务。
我发现我需要一个 AWS Step Function,用于迭代 JSON 输入数组。对于每个输入,我必须启动一个 ECS 任务,等待它处于 RUNNING 状态,然后转到下一步,调用 Lambda 函数。就我而言,ECS 任务本身不返回任何内容。它应该保持运行,因为 Lambda 函数使用它。
目前,我拥有它,以便 ECS 任务启动,但它停留在启动 ECS 任务步骤,因为它不返回任何内容。在进入下一步之前,我如何才能等待它处于 RUNNING 状态?
当前阶跃函数定义:
{
"StartAt": "Iterate",
"States": {
"Iterate": {
"Type": "Map",
"Iterator": {
"StartAt": "Start ECS Task",
"States": {
"Start ECS Task": {
"Type": "Task",
"Resource": "arn:aws:states:::ecs:runTask",
"Parameters": {
"LaunchType": "FARGATE",
"Cluster": "<cluster-arn>",
"TaskDefinition": "<task-definition-arn>",
"NetworkConfiguration": {
"AwsvpcConfiguration": {
"Subnets": [
"<subnet-id>"
],
"AssignPublicIp": "ENABLED"
}
}
},
"Next": "Invoke Lambda function" …Run Code Online (Sandbox Code Playgroud) amazon-web-services amazon-ecs aws-lambda aws-step-functions
我正在尝试在 AWS CDK 中创建一个带有 BatchSubmitJob 的状态机,并在 BatchContainerOverrides 中使用动态环境变量。我在想这样的事情:
container_overrides = sfn_tasks.BatchContainerOverrides(
environment={
"TEST.$": "$.dynamic_from_payload"
}
)
return sfn_tasks.BatchSubmitJob(self.scope,
id="id",
job_name="name",
job_definition_arn="arn",
job_queue_arn="arn",
container_overrides=container_overrides,
payload=sfn.TaskInput.from_object({
"dynamic_from_payload.$": "$.input.some_variable"
}))
Run Code Online (Sandbox Code Playgroud)
但是,在部署时,CDK 会将“名称”和“值”添加到状态机定义中,但值现在是静态的。这是状态机定义的一部分,如控制台中所示:
"Environment": [
{
"Name": "TEST.$",
"Value": "$.dynamic_from_payload"
}
]
Run Code Online (Sandbox Code Playgroud)
但我需要这样:
"Environment": [
{
"Name": "TEST",
"Value.$": "$.dynamic_from_payload"
}
]
Run Code Online (Sandbox Code Playgroud)
我还尝试使用“Ref::”,如此处对命令参数所做的那样:AWS Step 和 Batch Dynamic Command。但这也行不通。
我还研究了逃生舱口,覆盖了 CloudFormation 模板。但我认为这不适用于此处,因为生成的状态机定义字符串基本上是一个大字符串。
我可以想到两种解决方案,但这两种解决方案都不让我高兴:用转义舱口覆盖状态机定义字符串,并使用其中“值”在某些条件下被替换的副本(可能使用正则表达式)或将 lambda 放入状态机中这将创建并触发批处理作业以及一个将轮询作业是否完成的 lambda。
长话短说:有人知道如何在 CDK 中将动态环境变量与 BatchSubmitJob 一起使用吗?
我有一个Type: AWS::Serverless::HttpApi正在尝试连接到 aType: AWS::Serverless::StateMachine作为触发器。这意味着 HTTP API 将触发 Step Function 状态机。
我只需指定一个输入就可以让它工作。例如,DefinitionBody当它工作时,看起来像这样:
DefinitionBody:
info:
version: '1.0'
title:
Ref: AWS::StackName
paths:
"/github/secret":
post:
responses:
default:
description: "Default response for POST /"
x-amazon-apigateway-integration:
integrationSubtype: "StepFunctions-StartExecution"
credentials:
Fn::GetAtt: [StepFunctionsApiRole, Arn]
requestParameters:
Input: $request.body
StateMachineArn: !Ref SecretScannerStateMachine
payloadFormatVersion: "1.0"
type: "aws_proxy"
connectionType: "INTERNET"
timeoutInMillis: 30000
openapi: 3.0.1
x-amazon-apigateway-importexport-version: "1.0"
Run Code Online (Sandbox Code Playgroud)
请注意以下行:Input: $request.body。我只是指定$request.body.
但是,我需要能够发送$request.body和$request.header.X-Hub-Signature-256。我需要将这两个值作为输入发送到我的状态机。
我尝试过很多不同的方法。例如:
Input: " { body: $request.body, header: $request.header.X-Hub-Signature-256 }" …Run Code Online (Sandbox Code Playgroud) amazon-web-services aws-lambda aws-api-gateway aws-step-functions aws-http-api
aws-lambda ×2
amazon-ecs ×1
amazon-swf ×1
aws-batch ×1
aws-cdk ×1
aws-http-api ×1
boto3 ×1
devops ×1
github ×1
json ×1
localstack ×1
serverless ×1
terraform ×1
workflow ×1