Я хочу написать файл YAML, который создает конечный автомат ступенчатой функции и использует другие ресурсы, определенные в том же YAML. Поскольку имя моих ресурсов меняется между каждым стеком в формировании облака, я должен убедиться, что рабочий процесс пошаговых функций использует динамическую переменную с текущим именем.
например, вот как я определил свою функцию:
GeneralizeLabelRandom:
Type: AWS::Lambda::Function
Properties:
Description: !Sub
- Stack ${AWS::StackName} Function ${ResourceName}
- ResourceName: !Sub ${AWS::StackName}-GeneralizeLabelRandom-${AWS::AccountId}
Handler: index.handler
Role: !GetAtt LambdaExecutionRole.Arn
Code:
S3Bucket: !Ref S3BucketName
S3Key: GeneralizeLabelRandom.zip
Runtime: nodejs16.x
MemorySize: 3008
Timeout: 30
и это часть моей конфигурации StepFunctions::StateMachine — Я хочу заменить имя статического ресурса и использовать !Ref GeneralizeLabelRandom
MyStateMachine:
Type: AWS::StepFunctions::StateMachine
Properties:
StateMachineName: MyStateMachine
DefinitionString: |
{
"StartAt": "init",
"States": {
"init": {
"Type": "Pass",
"Next": "eventTypeSwitch"
},
"eventTypeSwitch": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.detail.reason",
"StringEquals": "PutObject",
"Next": "imageAnalysisCall"
}]
"Default": "eventTypeNotSupported"
},
"imageAnalysisCall": {
"Type": "Task",
** "Resource": "arn:aws:lambda:eu-central-1:696714140038:function:generalizeLabelRandom",
** "ResultPath": "$.LambdaResult",
"Next": "transformImageAnalysisData"
},
...
...
Я пытался использовать !RED или !GetAtt в определении конечного автомата, но получил синтаксические ошибки.

Вы хотите использовать свойства Definition и DefinitionSubstitution. Первый позволяет вам представить определение вашего конечного автомата, используя тот же синтаксис JSON или YAML, который вы используете для шаблона CloudFormation (нет необходимости создавать строки). Второй позволяет вам предоставлять внешние элементы (используя синтаксис ${subsitution_variable} в вашем определении и предоставляя значения времени развертывания для замены. Вот пример:
AWSTemplateFormatVersion: "2010-09-09"
Resources:
ApplicationRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
-
Effect: Allow
Principal:
Service:
- states.amazonaws.com
- lambda.amazonaws.com
Action:
- sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AWSStepFunctionsFullAccess
- arn:aws:iam::aws:policy/AWSLambda_FullAccess
Function1:
Type: AWS::Lambda::Function
Properties:
Code:
ZipFile: |
exports.handler = async (event) => {
console.info(event);
return event;
};
Handler: index.handler
Runtime: nodejs18.x
Role: !GetAtt ApplicationRole.Arn
StateMachine1:
Type: AWS::StepFunctions::StateMachine
Properties:
Definition:
StartAt: InvokeFunction
States:
InvokeFunction:
Type: Task
Resource: arn:aws:states:::lambda:invoke
Parameters:
FunctionName: ${function_name}
Payload:
input.$: $
End: true
DefinitionSubstitutions:
function_name: !Ref Function1
RoleArn: !GetAtt ApplicationRole.Arn
StateMachineType: STANDARD
Вы также можете посмотреть использование SAM с пошаговыми функциями . Преобразования SAM могут быть полезны для упрощения ресурсов (например, AWS::Serverless::StateMachine против AWS::StepFunctions::StateMachine), и они не требуют использования SAM CLI. Но если вы используете SAM CLI, это упрощает экспорт определений конечного автомата в отдельные файлы JSON или YAML. Это, как правило, еще удобнее и избавляет вас от необходимости хранить все в шаблоне CloudFormation. Вот один простой пример, в котором используется этот подход.