기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
이 자습서에서는 AWS CloudFormation을 사용하여 AWS Lambda 함수를 만듭니다. AWS CloudFormation 콘솔 및 YAML 템플릿을 사용하여 스택(IAM 역할, Lambda 함수 및 상태 시스템)을 만듭니다. 그런 다음 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 상태 시스템 만들기
-
다음 예제 데이터를 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"
]
}
}
}
}
}
-
AWS CloudFormation 콘솔을 열고 스택 생성을 선택합니다.
-
템플릿 선택 페이지에서 Amazon S3에 템플릿 업로드를 선택합니다. MyStateMachine
파일을 선택한 후 다음을 선택합니다.
-
세부 정보 지정 페이지에서 스택 이름에 MyStateMachine
을 입력한 후 다음을 선택합니다.
-
옵션 페이지에서 다음을 선택합니다.
-
검토 페이지에서 I acknowledge that AWS CloudFormation might create IAM resources를 선택한 다음 생성을 선택합니다.
AWS CloudFormation이 MyStateMachine
스택을 생성하기 시작하고 CREATE_IN_PROGRESS 상태를 표시합니다. 이 과정이 완료되면 AWS CloudFormation에는 CREATE_COMPLETE 상태가 표시됩니다.
-
(선택 사항) 스택에 리소스를 표시하려면 스택을 선택하고 [Resources ] 탭을 선택합니다.
3단계: 상태 시스템 실행 시작
Lambda 상태 시스템을 만들었으면 실행을 시작할 수 있습니다.
상태 시스템 실행을 시작하려면
-
Step Functions 콘솔을 열고 AWS CloudFormation을 사용하여 만든 상태 시스템의 이름을 선택합니다.
-
[MyStateMachine-ABCDEFGHIJ1K
] 페이지에서 [New execution]을 선택합니다.
[New execution] 페이지가 표시됩니다.
(선택 사항) 생성된 기본값을 재정의하려면 사용자 지정 실행 이름을 입력합니다.
Step Functions는 비 ASCII 문자가 포함된 상태 시스템, 실행, 활동 및 레이블 이름을 허용합니다. 이러한 문자는 Amazon CloudWatch에서 작동하지 않으므로 CloudWatch에서 지표를 추적할 수 있도록 ASCII 문자만 사용하는 것이 좋습니다.
-
실행 시작을 선택합니다.
상태 머신의 새로운 실행이 시작되고 실행 중인 실행을 보여주는 새로운 페이지가 표시됩니다.
-
(선택 사항) 실행 세부 정보에서 실행 상태와 시작됨 및 종료됨 타임스탬프를 검토합니다.
-
실행 결과를 보려면 Output(출력)을 선택합니다.