AWS CloudFormation를 사용하여 Step Functions용 Lambda 상태 시스템 만들기 - AWS Step Functions

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

AWS CloudFormation를 사용하여 Step Functions용 Lambda 상태 시스템 만들기

이 자습서에서는 를 사용하여 기본 AWS Lambda 함수를 만드는 방법을 보여줍니다 AWS CloudFormation. AWS CloudFormation 콘솔과 YAML 템플릿을 사용하여 스택 (IAM 역할, Lambda 함수, 상태 머신) 을 생성합니다. 그런 다음 AWS Step Functions 콘솔을 사용하여 스테이트 머신 실행을 시작합니다.

자세한 내용은 AWS CloudFormation 사용 설명서의 CloudFormation 템플릿AWS::StepFunctions::StateMachine 리소스 사용을 참조하십시오.

1단계: AWS CloudFormation 템플릿 설정

예제 템플릿을 사용하기 전에 AWS CloudFormation 템플릿의 다른 부분을 선언하는 방법을 이해해야 합니다.

Lambda용 IAM 역할을 생성하려면,

Lambda 함수용 IAM 역할과 관련된 신뢰 정책을 정의합니다. 다음 예제에서는 YAML 또는 JSON을 사용하여 신뢰 정책을 정의합니다.

YAML
LambdaExecutionRole: Type: "AWS::IAM::Role" Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: "sts:AssumeRole"
JSON
"LambdaExecutionRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } }

Lambda 함수를 생성하는 방법

Hello World 메시지를 출력하는 Lambda 함수의 다음 속성을 정의합니다.

중요

Lambda 함수가 상태 머신과 AWS 동일한 계정 AWS 및 지역에 속하는지 확인하십시오.

YAML
MyLambdaFunction: Type: "AWS::Lambda::Function" Properties: Handler: "index.handler" Role: !GetAtt [ LambdaExecutionRole, Arn ] Code: ZipFile: | exports.handler = (event, context, callback) => { callback(null, "Hello World!"); }; Runtime: "nodejs12.x" Timeout: "25"
JSON
"MyLambdaFunction": { "Type": "AWS::Lambda::Function", "Properties": { "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "LambdaExecutionRole", "Arn" ] }, "Code": { "ZipFile": "exports.handler = (event, context, callback) => {\n callback(null, \"Hello World!\");\n};\n" }, "Runtime": "nodejs12.x", "Timeout": "25" } },

상태 시스템 실행에 대한 IAM 역할 만들기

상태 시스템 실행에 대한 IAM 역할과 관련된 신뢰 정책을 정의합니다.

YAML
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: "*"
JSON
"StatesExecutionRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ { "Fn::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": "*" } ] } } ] } },

Lambda 상태 시스템 만들기

Lambda 상태 시스템을 정의합니다.

YAML
MyStateMachine: Type: "AWS::StepFunctions::StateMachine" Properties: DefinitionString: !Sub - |- { "Comment": "A Hello World example using an AWS Lambda function", "StartAt": "HelloWorld", "States": { "HelloWorld": { "Type": "Task", "Resource": "${lambdaArn}", "End": true } } } - {lambdaArn: !GetAtt [ MyLambdaFunction, Arn ]} RoleArn: !GetAtt [ StatesExecutionRole, Arn ]
JSON
"MyStateMachine": { "Type": "AWS::StepFunctions::StateMachine", "Properties": { "DefinitionString": { "Fn::Sub": [ "{\n \"Comment\": \"A Hello World example using an AWS Lambda function\",\n \"StartAt\": \"HelloWorld\",\n \"States\": {\n \"HelloWorld\": {\n \"Type\": \"Task\",\n \"Resource\": \"${lambdaArn}\",\n \"End\": true\n }\n }\n}", { "lambdaArn": { "Fn::GetAtt": [ "MyLambdaFunction", "Arn" ] } } ] }, "RoleArn": { "Fn::GetAtt": [ "StatesExecutionRole", "Arn" ] } } }

2단계: AWS CloudFormation 템플릿을 사용하여 Lambda 상태 시스템 생성

AWS CloudFormation 템플릿의 구성 요소를 이해하면 구성 요소를 한데 모아 템플릿을 사용하여 스택을 생성할 수 있습니다. AWS CloudFormation

Lambda 상태 시스템 만들기

  1. 다음 예제 데이터를 YAML 예제용 MyStateMachine.yaml 또는 JSON용 MyStateMachine.json 파일에 복사합니다.

    YAML
    AWSTemplateFormatVersion: "2010-09-09" Description: "An example template with an IAM role for a Lambda state machine." Resources: LambdaExecutionRole: Type: "AWS::IAM::Role" Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: "sts:AssumeRole" MyLambdaFunction: Type: "AWS::Lambda::Function" Properties: Handler: "index.handler" Role: !GetAtt [ LambdaExecutionRole, Arn ] Code: ZipFile: | exports.handler = (event, context, callback) => { callback(null, "Hello World!"); }; Runtime: "nodejs12.x" Timeout: "25" 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: "*" MyStateMachine: Type: "AWS::StepFunctions::StateMachine" Properties: DefinitionString: !Sub - |- { "Comment": "A Hello World example using an AWS Lambda function", "StartAt": "HelloWorld", "States": { "HelloWorld": { "Type": "Task", "Resource": "${lambdaArn}", "End": true } } } - {lambdaArn: !GetAtt [ MyLambdaFunction, Arn ]} RoleArn: !GetAtt [ StatesExecutionRole, Arn ]
    JSON
    { "AWSTemplateFormatVersion": "2010-09-09", "Description": "An example template with an IAM role for a Lambda state machine.", "Resources": { "LambdaExecutionRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } } }, "MyLambdaFunction": { "Type": "AWS::Lambda::Function", "Properties": { "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "LambdaExecutionRole", "Arn" ] }, "Code": { "ZipFile": "exports.handler = (event, context, callback) => {\n callback(null, \"Hello World!\");\n};\n" }, "Runtime": "nodejs12.x", "Timeout": "25" } }, "StatesExecutionRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ { "Fn::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": "*" } ] } } ] } }, "MyStateMachine": { "Type": "AWS::StepFunctions::StateMachine", "Properties": { "DefinitionString": { "Fn::Sub": [ "{\n \"Comment\": \"A Hello World example using an AWS Lambda function\",\n \"StartAt\": \"HelloWorld\",\n \"States\": {\n \"HelloWorld\": {\n \"Type\": \"Task\",\n \"Resource\": \"${lambdaArn}\",\n \"End\": true\n }\n }\n}", { "lambdaArn": { "Fn::GetAtt": [ "MyLambdaFunction", "Arn" ] } } ] }, "RoleArn": { "Fn::GetAtt": [ "StatesExecutionRole", "Arn" ] } } } } }
  2. AWS CloudFormation 콘솔을 열고 스택 생성을 선택합니다.

  3. 템플릿 선택 페이지에서 Amazon S3에 템플릿 업로드를 선택합니다. MyStateMachine 파일을 선택한 후 다음을 선택합니다.

  4. 세부 정보 지정 페이지에서 스택 이름MyStateMachine을 입력한 후 다음을 선택합니다.

  5. 옵션 페이지에서 다음을 선택합니다.

  6. 검토 페이지에서 I acknowledge that AWS CloudFormation might create IAM resources를 선택한 다음 생성을 선택합니다.

    AWS CloudFormation MyStateMachine스택 생성을 시작하고 CREATE_IN_PROGRESS 상태를 표시합니다. 이 과정이 완료되면 AWS CloudFormation 에는 CREATE_COMPLETE 상태가 표시됩니다.

  7. (선택 사항) 스택에 리소스를 표시하려면 스택을 선택하고 [Resources ] 탭을 선택합니다.

    
                리소스 표시

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

Lambda 상태 시스템을 만들었으면 실행을 시작할 수 있습니다.

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

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

  2. MyStateMachine-ABCDEFGHIJ1K 페이지에서 새 실행을 선택합니다.

    [New execution] 페이지가 표시됩니다.

  3. (선택 사항) 실행을 식별하려면 이름 상자에 해당 실행의 이름을 지정하면 됩니다. 기본적으로 Step Functions는 고유한 실행 이름을 자동으로 생성합니다.

    참고

    Step Functions를 사용하면 상태 머신, 실행 및 활동의 이름과 ASCII가 아닌 문자가 포함된 레이블을 만들 수 있습니다. 이러한 비 ASCII 이름은 Amazon에서 사용할 수 없습니다. CloudWatch CloudWatch 지표를 추적할 수 있도록 하려면 ASCII 문자만 사용하는 이름을 선택하십시오.

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

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

  5. (선택 사항) 실행 세부 정보에서 실행 상태시작됨종료됨 타임스탬프를 검토합니다.

  6. 실행 결과를 보려면 Output(출력)을 선택합니다.