사용 AWS CDK Step Functions에서 표준 워크플로를 만들려면 - AWS Step Functions

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

사용 AWS CDK Step Functions에서 표준 워크플로를 만들려면

다음을 사용할 수 있습니다.AWS Cloud Development Kit (AWS CDK) 코드형 인프라 (IAC) 프레임워크를 생성하여 AWS Step Functions 다음을 포함하는 스테이트 머신 AWS Lambda 함수.

다음을 정의합니다. AWS 다음 중 하나를 사용하는 인프라 CDK의 지원 언어. 인프라를 정의한 후에는 앱을 다음과 같이 합성합니다.AWS CloudFormation 템플릿을 작성하여 다음 사이트에 배포하십시오. AWS 계정.

이 메서드를 사용하여 Lambda 함수를 포함하는 Step Functions 상태 머신을 정의한 다음 Step Functions를 사용하여 상태 머신을 실행합니다. AWS Management Console.

이 자습서를 시작하기 전에 다음을 설정해야 합니다.AWS CDK 시작하기에 설명된 개발 환경은 다음과 같습니다.AWS CDK - 사전 요구 사항 AWS Cloud Development Kit (AWS CDK) 개발자 가이드. 그런 다음 설치하세요.AWS CDK 다음 명령을 사용하여 AWS CLI:

npm install -g aws-cdk

이 자습서에서는 사용 AWS CloudFormation Step Functions에서 워크플로를 만들려면와 동일한 결과를 생성합니다. 하지만 이 튜토리얼에서는 AWS CDK 아무것도 만들 필요가 없습니다.IAM 역할;AWS CDK 당신을 위해 해줘요. 그 AWS CDK 버전에는 상태 머신에 단계를 추가하는 방법을 설명하는 워크플로 상태 성공 단계도 포함되어 있습니다.

작은 정보

를 시작하는 샘플 서버리스 애플리케이션을 배포하려면 Step Functions 워크플로: 사용 AWS CDK TypeScript 당신과 함께 AWS 계정모듈 10 - 다음을 통해 배포를 참조하십시오.AWS CDK의 AWS Step Functions 워크샵.

1단계: 설정 AWS CDK project

  1. 홈 디렉터리 또는 원하는 경우 다른 디렉터리에서 다음 명령을 실행하여 새 디렉터리를 생성합니다.AWS CDK 앱.

    중요

    디렉터리 이름을 step으로 지정해야 합니다. 더 AWS CDK 애플리케이션 템플릿은 디렉토리 이름을 사용하여 소스 파일 및 클래스의 이름을 생성합니다. 다른 이름을 사용하는 경우 앱이 이 자습서와 일치하지 않습니다.

    TypeScript
    mkdir step && cd step
    JavaScript
    mkdir step && cd step
    Python
    mkdir step && cd step
    Java
    mkdir step && cd step
    C#

    설치가 완료되었는지 확인하세요. NET버전 6.0 이상. 자세한 내용은 지원되는 버전을 참조하세요.

    mkdir step && cd step
  2. cdk init 명령을 사용하여 앱을 초기화합니다. 다음 예제와 같이 원하는 템플릿(“app”)과 프로그래밍 언어를 지정합니다.

    TypeScript
    cdk init --language typescript
    JavaScript
    cdk init --language javascript
    Python
    cdk init --language python

    프로젝트가 초기화된 후 프로젝트의 가상 환경을 활성화하고 다음을 설치합니다.AWS CDK의 기본 종속성.

    source .venv/bin/activate python -m pip install -r requirements.txt
    Java
    cdk init --language java
    C#
    cdk init --language csharp

2단계: 사용 AWS CDK 스테이트 머신을 만들려면

먼저, 다음을 정의하는 개별 코드를 제시하겠습니다.Lambda 함수 및 Step Functions 스테이트 머신. 그런 다음, 그것들을 하나로 모으는 방법을 설명해 드리겠습니다.AWS CDK 앱. 마지막으로 이러한 리소스를 합성하고 배포하는 방법을 살펴보겠습니다.

만들려면 Lambda 함수

다음과 같습니다.AWS CDK 코드는 다음을 정의합니다.Lambda 소스 코드를 인라인으로 제공하는 함수.

TypeScript
const helloFunction = new lambda.Function(this, 'MyLambdaFunction', { code: lambda.Code.fromInline(` exports.handler = (event, context, callback) => { callback(null, "Hello World!"); }; `), runtime: lambda.Runtime.NODEJS_18_X, handler: "index.handler", timeout: cdk.Duration.seconds(3) });
JavaScript
const helloFunction = new lambda.Function(this, 'MyLambdaFunction', { code: lambda.Code.fromInline(` exports.handler = (event, context, callback) => { callback(null, "Hello World!"); }; `), runtime: lambda.Runtime.NODEJS_18_X, handler: "index.handler", timeout: cdk.Duration.seconds(3) });
Python
hello_function = lambda_.Function( self, "MyLambdaFunction", code=lambda_.Code.from_inline(""" exports.handler = (event, context, callback) => { callback(null, "Hello World!"); }"""), runtime=lambda_.Runtime.NODEJS_18_X, handler="index.handler", timeout=Duration.seconds(25))
Java
final Function helloFunction = Function.Builder.create(this, "MyLambdaFunction") .code(Code.fromInline( "exports.handler = (event, context, callback) => { callback(null, 'Hello World!' );}")) .runtime(Runtime.NODEJS_18_X) .handler("index.handler") .timeout(Duration.seconds(25)) .build();
C#
var helloFunction = new Function(this, "MyLambdaFunction", new FunctionProps { Code = Code.FromInline(@"` exports.handler = (event, context, callback) => { callback(null, 'Hello World!'); }"), Runtime = Runtime.NODEJS_12_X, Handler = "index.handler", Timeout = Duration.Seconds(25) });

이 짧은 예제 코드에서 다음을 확인할 수 있습니다.

  • 함수의 논리명(MyLambdaFunction)

  • 함수의 소스 코드로, 소스 코드에 문자열로 포함되어 있습니다.AWS CDK 앱.

  • 기타 함수 속성(예: 사용할 런타임(Node 18.x)), 함수 진입점 및 제한 시간

상태 시스템을 생성하려면

스테이트 머신에는 두 가지 상태가 있습니다. a Lambda 함수 태스크와 워크플로 상태 성공 상태. 함수를 생성하려면 다음을 생성해야 합니다.Step Functions 작업 워크플로 상태그러면 함수가 호출됩니다. 이 Task 상태는 상태 시스템의 첫 번째 단계로 사용됩니다. Task 상태의 next() 메서드를 통해 성공 상태가 상태 시스템에 추가됩니다. 다음 코드는 먼저 MyLambdaTask 함수를 간접적으로 호출한 다음 next() 메서드를 사용하여 GreetedWorld 성공 상태를 정의합니다.

TypeScript
const stateMachine = new sfn.StateMachine(this, 'MyStateMachine', { definition: new tasks.LambdaInvoke(this, "MyLambdaTask", { lambdaFunction: helloFunction }).next(new sfn.Succeed(this, "GreetedWorld")) });
JavaScript
const stateMachine = new sfn.StateMachine(this, 'MyStateMachine', { definition: new tasks.LambdaInvoke(this, "MyLambdaTask", { lambdaFunction: helloFunction }).next(new sfn.Succeed(this, "GreetedWorld")) });
Python
state_machine = sfn.StateMachine( self, "MyStateMachine", definition=tasks.LambdaInvoke( self, "MyLambdaTask", lambda_function=hello_function) .next(sfn.Succeed(self, "GreetedWorld")))
Java
final StateMachine stateMachine = StateMachine.Builder.create(this, "MyStateMachine") .definition(LambdaInvoke.Builder.create(this, "MyLambdaTask") .lambdaFunction(helloFunction) .build() .next(new Succeed(this, "GreetedWorld"))) .build();
C#
var stateMachine = new StateMachine(this, "MyStateMachine", new StateMachineProps { DefinitionBody = DefinitionBody.FromChainable(new LambdaInvoke(this, "MyLambdaTask", new LambdaInvokeProps { LambdaFunction = helloFunction }) .Next(new Succeed(this, "GreetedWorld"))) });

빌드하고 배포하려면 AWS CDK 앱

새로 만든 파일에 AWS CDK 프로젝트에서 스택의 정의가 포함된 파일을 다음 예제 코드처럼 편집합니다. 의 정의를 알 수 있을 것입니다.Lambda 함수 및 Step Functions 이전 섹션의 스테이트 머신.

  1. 다음 예제와 같이 스택을 업데이트합니다.

    TypeScript

    다음 코드로 lib/step-stack.ts를 업데이트합니다.

    import * as cdk from 'aws-cdk-lib'; import * as lambda from 'aws-cdk-lib/aws-lambda'; import * as sfn from 'aws-cdk-lib/aws-stepfunctions'; import * as tasks from 'aws-cdk-lib/aws-stepfunctions-tasks'; export class StepStack extends cdk.Stack { constructor(app: cdk.App, id: string) { super(app, id); const helloFunction = new lambda.Function(this, 'MyLambdaFunction', { code: lambda.Code.fromInline(` exports.handler = (event, context, callback) => { callback(null, "Hello World!"); }; `), runtime: lambda.Runtime.NODEJS_18_X, handler: "index.handler", timeout: cdk.Duration.seconds(3) }); const stateMachine = new sfn.StateMachine(this, 'MyStateMachine', { definition: new tasks.LambdaInvoke(this, "MyLambdaTask", { lambdaFunction: helloFunction }).next(new sfn.Succeed(this, "GreetedWorld")) }); } }
    JavaScript

    다음 코드로 lib/step-stack.js를 업데이트합니다.

    import * as cdk from 'aws-cdk-lib'; import * as lambda from 'aws-cdk-lib/aws-lambda'; import * as sfn from 'aws-cdk-lib/aws-stepfunctions'; import * as tasks from 'aws-cdk-lib/aws-stepfunctions-tasks'; export class StepStack extends cdk.Stack { constructor(app, id) { super(app, id); const helloFunction = new lambda.Function(this, 'MyLambdaFunction', { code: lambda.Code.fromInline(` exports.handler = (event, context, callback) => { callback(null, "Hello World!"); }; `), runtime: lambda.Runtime.NODEJS_18_X, handler: "index.handler", timeout: cdk.Duration.seconds(3) }); const stateMachine = new sfn.StateMachine(this, 'MyStateMachine', { definition: new tasks.LambdaInvoke(this, "MyLambdaTask", { lambdaFunction: helloFunction }).next(new sfn.Succeed(this, "GreetedWorld")) }); } }
    Python

    다음 코드로 step/step_stack.py를 업데이트합니다.

    from aws_cdk import ( Duration, Stack, aws_stepfunctions as sfn, aws_stepfunctions_tasks as tasks, aws_lambda as lambda_ ) class StepStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) hello_function = lambda_.Function( self, "MyLambdaFunction", code=lambda_.Code.from_inline(""" exports.handler = (event, context, callback) => { callback(null, "Hello World!"); }"""), runtime=lambda_.Runtime.NODEJS_18_X, handler="index.handler", timeout=Duration.seconds(25)) state_machine = sfn.StateMachine( self, "MyStateMachine", definition=tasks.LambdaInvoke( self, "MyLambdaTask", lambda_function=hello_function) .next(sfn.Succeed(self, "GreetedWorld")))
    Java

    다음 코드로 src/main/java/com.myorg/StepStack.java를 업데이트합니다.

    package com.myorg; import software.constructs.Construct; import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; import software.amazon.awscdk.Duration; import software.amazon.awscdk.services.lambda.Code; import software.amazon.awscdk.services.lambda.Function; import software.amazon.awscdk.services.lambda.Runtime; import software.amazon.awscdk.services.stepfunctions.StateMachine; import software.amazon.awscdk.services.stepfunctions.Succeed; import software.amazon.awscdk.services.stepfunctions.tasks.LambdaInvoke; public class StepStack extends Stack { public StepStack(final Construct scope, final String id) { this(scope, id, null); } public StepStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); final Function helloFunction = Function.Builder.create(this, "MyLambdaFunction") .code(Code.fromInline( "exports.handler = (event, context, callback) => { callback(null, 'Hello World!' );}")) .runtime(Runtime.NODEJS_18_X) .handler("index.handler") .timeout(Duration.seconds(25)) .build(); final StateMachine stateMachine = StateMachine.Builder.create(this, "MyStateMachine") .definition(LambdaInvoke.Builder.create(this, "MyLambdaTask") .lambdaFunction(helloFunction) .build() .next(new Succeed(this, "GreetedWorld"))) .build(); } }
    C#

    다음 코드로 src/Step/StepStack.cs를 업데이트합니다.

    using Amazon.CDK; using Constructs; using Amazon.CDK.AWS.Lambda; using Amazon.CDK.AWS.StepFunctions; using Amazon.CDK.AWS.StepFunctions.Tasks; namespace Step { public class StepStack : Stack { internal StepStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { var helloFunction = new Function(this, "MyLambdaFunction", new FunctionProps { Code = Code.FromInline(@"exports.handler = (event, context, callback) => { callback(null, 'Hello World!'); }"), Runtime = Runtime.NODEJS_18_X, Handler = "index.handler", Timeout = Duration.Seconds(25) }); var stateMachine = new StateMachine(this, "MyStateMachine", new StateMachineProps { DefinitionBody = DefinitionBody.FromChainable(new LambdaInvoke(this, "MyLambdaTask", new LambdaInvokeProps { LambdaFunction = helloFunction }) .Next(new Succeed(this, "GreetedWorld"))) }); } } }
  2. 소스 파일을 저장한 다음 앱의 기본 디렉터리에서 cdk synth 명령을 실행합니다.

    AWS CDK 앱을 실행하고 합성합니다.AWS CloudFormation 템플릿으로 만든 것입니다.AWS CDK 그런 다음 템플릿을 표시합니다.

    참고

    다음을 만들 TypeScript 때 사용한 경우 AWS CDK 프로젝트에서 cdk synth 명령을 실행하면 다음 오류가 반환될 수 있습니다.

    TSError: ⨯ Unable to compile TypeScript: bin/step.ts:7:33 - error TS2554: Expected 2 arguments, but got 3.

    다음 예제와 같이 bin/step.ts 파일을 수정하여 이 오류를 해결합니다.

    #!/usr/bin/env node import 'source-map-support/register'; import * as cdk from 'aws-cdk-lib'; import { StepStack } from '../lib/step-stack'; const app = new cdk.App(); new StepStack(app, 'StepStack'); app.synth();
  3. Lambda 함수 및 Step Functions 상태 머신을 사용자 컴퓨터에 배포하려면 AWS 계정, 발급. cdk deploy IAM정책을 승인하라는 메시지가 표시됩니다. AWS CDK 생성했습니다.

3단계: 상태 시스템 실행 시작

상태 시스템을 만든 후에 실행을 시작할 수 있습니다.

상태 시스템 실행을 시작하려면

  1. Step Functions 콘솔을 열고 사용하여 만든 상태 머신의 이름을 선택합니다.AWS CDK.

  2. 상태 시스템 페이지에서 실행 시작을 선택합니다.

    실행 시작 대화 상자가 표시됩니다.

  3. (선택 사항) 생성된 기본값을 재정의하려면 사용자 지정 실행 이름을 입력합니다.

    ASCII비이름 및 로깅

    Step Functions는 ASCII -자가 아닌 문자를 포함하는 상태 머신, 실행, 액티비티 및 레이블의 이름을 허용합니다. CloudWatchAmazon에서는 이러한 문자를 사용할 수 없으므로 지표를 추적할 수 있도록 ASCII 문자만 사용하는 것이 좋습니다 CloudWatch.

  4. 실행 시작을 선택합니다.

    상태 시스템 실행이 시작되고 실행 중인 실행을 보여주는 새로운 페이지가 표시됩니다.

  5. Step Functions 콘솔은 실행 ID가 제목인 페이지로 이동합니다. 이 페이지를 실행 세부 정보 페이지라고 합니다. 실행이 진행되는 동안 또는 완료된 후에 이 페이지에서 실행 결과를 검토할 수 있습니다.

    실행 결과를 검토하려면 그래프 보기에서 개별 상태를 선택한 다음 단계 세부 정보 창에서 개별 탭을 선택하여 입력, 출력 및 정의가 포함된 각 상태의 세부 정보를 각각 봅니다. 실행 세부 정보 페이지에서 볼 수 있는 실행 정보에 대한 자세한 내용은 실행 세부 정보 개요 섹션을 참조하세요.

4단계: 정리

스테이트 머신을 테스트한 후에는 스테이트 머신과 관련 Lambda 함수를 모두 제거하여 스테이트의 리소스를 확보하는 것이 좋습니다. AWS 계정. 앱의 기본 디렉터리에서 cdk destroy 명령을 실행하여 상태 머신을 제거합니다.

다음 단계

개발에 대해 자세히 알아보려면 AWS 인프라 사용 AWS CDK, 참조 AWS CDK 개발자 가이드.

글쓰기에 대한 자세한 내용은 여기를 참조하십시오.AWS CDK 선택한 언어의 앱은 다음을 참조하십시오.

TypeScript

작업 대상 AWS CDK 에서 TypeScript

JavaScript

함께 일하기 AWS CDK 에서 JavaScript

Python

함께 일하기 AWS CDK Python에서

Java

함께 작업하기 AWS CDK 자바에서

C#

함께 작업하기 AWS CDK C #에서

에 대한 자세한 내용은 AWS 이 튜토리얼에서 사용되는 라이브러리 모듈 생성은 다음을 참조하십시오.AWS CDK API참조 개요: