template.yaml 파일을 수정합니다. Resources 항목 아래의 Events를 변경합니다.
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.8
Events:
CheckScheduledEvent:
Type: Schedule
Properties:
Schedule: rate(1 minute)
Outputs 내용 중 API gateway 내용은 삭제합니다.
Outputs:
HelloWorldFunction:
Description: "Hello World Lambda Function ARN"
Value: !GetAtt HelloWorldFunction.Arn
HelloWorldFunctionIamRole:
Description: "Implicit IAM Role created for Hello World function"
Value: !GetAtt HelloWorldFunctionRole.Arn
5. Test
5.1 Build
Docker container로 코드를 build합니다.
sam build --use-container
or
위의 코드를 실행했는데 에러가 발생한다면 아래의 코드로 실행하세요. Image Repository를 Amazon ECR에서 DockerHub로 변경한 코드입니다. 여기를 눌러 추가 컨테이너 이미지를 확인할 수 있습니다.
sam build --use-container --build-image amazon/aws-sam-cli-build-image-python3.8
빌드에 성공하였다면, 아래처럼 Output을 출력합니다.
Starting Build inside a container
...
Fetching amazon/aws-sam-cli-build-image-python3.8 Docker container image...............................
...
Build Succeeded
Built Artifacts : .aws-sam\build
Built Template : .aws-sam\build\template.yaml
Commands you can use next
=========================
[*] Invoke Function: sam local invoke
[*] Deploy: sam deploy --guided
Running PythonPipBuilder:ResolveDependencies
Running PythonPipBuilder:CopySource
5.2 Test
Event로 Lambda를 호출하였을 때 의도대로 동작하는지 테스트합니다.
sam local invoke
특별한 건 없으니, app.py에 정의한 return대로 나오는 것을 확인할 수 있습니다.
Invoking app.lambda_handler (python3.8)
Image was not found.
Building image..............................................................
Skip pulling image and use local one: amazon/aws-sam-cli-emulation-image-python3.8:rapid-1.23.0.
...
START RequestId: 0b770a09-33ec-4349-9714-bc0d93b6f55f Version: $LATEST
END RequestId: 0b770a09-33ec-4349-9714-bc0d93b6f55f
REPORT RequestId: 0b770a09-33ec-4349-9714-bc0d93b6f55f Init Duration: 0.20 ms Duration: 119.95 ms Billed Duration: 200 ms Memory Size: 128 MB Max Memory Used: 128 MB
{"statusCode": 200, "body": "{\"message\": \"hello world\"}"}
6. 배포
아래 명령어를 입력하여 배포를 시작합니다.
sam deploy --guided
설정에 필요한 값을 입력하면 자동으로 Cloudformation Stack을 생성하여 Lambda를 생성합니다.
Configuring SAM deploy
======================
Looking for config file [samconfig.toml] : Not found
Setting default arguments for 'sam deploy'
=========================================
Stack Name [sam-app]: laminar
AWS Region [ap-southeast-1]:
#Shows you resources changes to be deployed and require a 'Y' to initiate deploy
Confirm changes before deploy [y/N]: y
#SAM needs permission to be able to create roles to connect to the resources in your template
Allow SAM CLI IAM role creation [Y/n]: y
Save arguments to configuration file [Y/n]: y
SAM configuration file [samconfig.toml]:
SAM configuration environment [default]:
Looking for resources needed for deployment: Not found.
Creating the required resources...
Successfully created!
Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-3k8v1edfkc8r
A different default S3 bucket can be set in samconfig.toml
Saved arguments to config file
Running 'sam deploy' for future deployments will use the parameters saved above.
The above parameters can be changed by modifying samconfig.toml
Learn more about samconfig.toml syntax at
https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-config.html
Uploading to laminar/4026c532d246ee38cd02526cefa4b0ca 599959 / 599959 (100.00%)
Deploying with following values
===============================
Stack name : laminar
Region : ap-southeast-1
Confirm changeset : True
Deployment s3 bucket : aws-sam-cli-managed-default-samclisourcebucket-3k8v1edfkc8r
Capabilities : ["CAPABILITY_IAM"]
Parameter overrides : {}
Signing Profiles : {}
Initiating deployment
=====================
Uploading to laminar/403e1d4b78e92f8b88a182cbbace44aa.template 937 / 937 (100.00%)
Waiting for changeset to be created..
CloudFormation stack changeset
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Operation LogicalResourceId ResourceType Replacement
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Add HelloWorldFunctionCheckScheduledEventPermission AWS::Lambda::Permission N/A
+ Add HelloWorldFunctionCheckScheduledEvent AWS::Events::Rule N/A
+ Add HelloWorldFunctionRole AWS::IAM::Role N/A
+ Add HelloWorldFunction AWS::Lambda::Function N/A
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Changeset created successfully. arn:aws:cloudformation:ap-southeast-1:<Your-AWS-Account-Number>:changeSet/samcli-deploy1620266678/50099513-3dad-4d7f-9394-06ba407654ff
Previewing CloudFormation changeset before deployment
======================================================
Deploy this changeset? [y/N]: y
2021-05-06 11:04:54 - Waiting for stack create/update to complete
CloudFormation events from changeset
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ResourceStatus ResourceType LogicalResourceId ResourceStatusReason
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CREATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole Resource creation Initiated
CREATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole -
CREATE_COMPLETE AWS::IAM::Role HelloWorldFunctionRole -
CREATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction Resource creation Initiated
CREATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction -
CREATE_COMPLETE AWS::Lambda::Function HelloWorldFunction -
CREATE_IN_PROGRESS AWS::Events::Rule HelloWorldFunctionCheckScheduledEvent -
CREATE_IN_PROGRESS AWS::Events::Rule HelloWorldFunctionCheckScheduledEvent Resource creation Initiated
CREATE_COMPLETE AWS::Events::Rule HelloWorldFunctionCheckScheduledEvent -
CREATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionCheckScheduledEventPermission Resource creation Initiated
CREATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionCheckScheduledEventPermission -
CREATE_COMPLETE AWS::Lambda::Permission HelloWorldFunctionCheckScheduledEventPermission -
CREATE_COMPLETE AWS::CloudFormation::Stack laminar -
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CloudFormation outputs from deployed stack
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Outputs
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Key HelloWorldFunctionIamRole
Description Implicit IAM Role created for Hello World function
Value arn:aws:iam::<Your-AWS-Account-Number>:role/laminar-HelloWorldFunctionRole-PDFE5J2Z023K
Key HelloWorldFunction
Description Hello World Lambda Function ARN
Value arn:aws:lambda:ap-southeast-1:<Your-AWS-Account-Number>:function:laminar-HelloWorldFunction-J7T81X5HW8UU
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Successfully created/updated stack - laminar in ap-southeast-1
필요한 라이브러리까지 포함하여 생성한 것을 Console에서 확인할 수 있습니다.
7. 삭제
AWS SAM CLI는 stack 삭제를 지원하지 않고, AWS CLI를 사용하거나 VScode AWS Toolkit 확장 기능을 활용하여 삭제할 수 있습니다.