IT STUDY LOG
[마이크로서비스 작성] 02. 마이크로서비스 배포 툴 본문
# 학습 목표
- 대표적인 FaaS 서비스인 AWS Lambda의 사용법을 이해할 수 있다.
- Lambda를 실행하는 다양한 트리거의 종류를 확인할 수 있다.
- Lambda의 작동 로그를 CloudWatch Logs를 통해 확인할 수 있다.
- Lambda의 작동원리를 이해할 수 있다. (advanced)
- API Gateway를 통해 Lambda를 실행할 수 있다.
- API Gateway에 API 키 및 Authorizer로 액세스 제어를 적용할 수 있다.
- HTTP 메서드별 라우팅을 적용할 수 있다.
- 새로운 릴리스/다양한 Stage의 API를 배포할 수 있다.
- SAM을 이용해 제공되는 다양한 마이크로서비스 애플리케이션을 배포할 수 있다.
# 학습 내용
1. SAM Hands-on
Lambda 함수를 배포하는 방법
- Lambda 함수를 배포하는 여러 가지 방법이 있으며 Lambda는 컨테이너 이미지 및 .zip 파일 아카이브의 두 가지 배포 패키지를 지원
- .zip 파일 아카이브로 정의된 Lambda 함수 생성
- Lambda 콘솔과 Lambda API를 사용하여 .zip 파일 아카이브로 정의된 함수를 만들 수 있음
- 업데이트된 .zip 파일을 업로드하여 함수 코드를 변경 가능
- 콘솔을 통해 직접 코드를 작성하는 것도 가능
- 컨테이너 이미지
- FROM amazon/aws-lambda-nodejs:12와 같이 주어진 이미지 위에 애플리케이션을 올린 후 빌드하여 배포 가능
AWS에서 제시하는 애플리케이션 모델
- Lambda 콘솔을 통해 직접 애플리케이션을 개발하는 것은 다소 불편하므로 AWS에서는 서버리스 애플리케이션을 쉽게 테스트하고 배포할 수 있는 서버리스 애플리케이션 모델(Serverless Application Model, 이하 SAM)을 제공
대표적인 기능
한 번에 배포
- Lambda 함수, API Gateway 등의 리소스를 CLI 명령어 한 번으로 배포하도록 할 수 있음
로컬에서의 테스트
- 꼭 배포하지 않아도 로컬 환경에서 테스트 가능
AWS CloudFormation 기능을 이용한 단일 작업을 통한 리소스(인프라) 관리
- AWS CloudFormation은 이후에 배우게 될 Terraform과 같은 Infrastructure as Code 도구
2. SAM CLI 설치 및 실습
Step 1 : AWS SAM CLI 설치
0. AWS SAM CLI 설치 전 사전 요구 사항
- AWS 계정 가입
- 관리자 IAM 사용자 생성
- 액세스 키 ID 및 보안 액세스 키 생성
- 설치 중AWS CLI
- AWS자격 증명 구성
1. AWS SAM CLI 설치 (Linux)
(1). AWS SAMCLI.zip 파일을 원하는 디렉터리에 다운로드
(2) 다음 명령을 사용하여 해시 값을 생성하여 다운로드한 설치 관리자 파일의 무결성 및 신뢰성 확인
$ sha256sum aws-sam-cli-linux-x86_64.zip
<64-character SHA256 hash value> aws-sam-cli-linux-x86_64.zip
(3) 64자의 SHA-256 해시 값을 CLI 릴리스 노트에서 원하는 AWS SAM CLI 버전에 대한 값과 비교
(4) 선택한 디렉터리에 설치 파일의 압축 풀기
$ unzip aws-sam-cli-linux-x86_64.zip -d sam-installation
(5) install 실행 파일을 실행하여AWS SAM CLI를 설치
$ sudo ./sam-installation/install
(6) 설치를 확인, 성공적으로 완료하면 다음과 같은 결과가 표시됨
$ sam --version
SAM CLI, version 1.58.0
Step 2 : 튜토리얼: Hello World 애플리케이션 배포
튜토리얼 내용
- 샘플 Hello World 애플리케이션을 초기화, 빌드 및 배포
- 로컬에서 변경하고 AWS CloudFormation에 동기화
- AWS 클라우드에서 애플리케이션을 테스트
- 선택적으로 개발 호스트에서 로컬 테스트를 수행 가능
- AWS 클라우드에서 샘플 애플리케이션을 삭제
샘플 Hello World 애플리케이션은 기본적인 API 백엔드를 구현하며 다음 리소스로 구성
- Amazon API Gateway : 함수를 호출하는 데 사용할 API 엔드포인트
- AWS Lambda : HTTP API GET 요청을 처리하고hello world 메시지를 반환하는 함수
- AWS Identity and Access Management(IAM) 역할 : 서비스가 안전하게 상호 작용할 수 있도록 권한을 제공
애플리케이션의 구성 요소
1. 샘플 Hello World 애플리케이션 초기화
(1) AWS SAM CLI에서 sam init 명령어를 통해 새 애플리케이션을 초기화
- 대괄호 ([ ]) 는 기본값을 나타내며 기본값을 선택하려면 공란으로 입력
$ sam init
SAM CLI now collects telemetry to better understand customer needs.
You can OPT OUT and disable telemetry collection by setting the
environment variable SAM_CLI_TELEMETRY=0 in your shell.
Thanks for your help!
Learn More: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-telemetry.html
You can preselect a particular runtime or package type when using the `sam init` experience.
Call `sam init --help` to learn more.
Which template source would you like to use?
1 - AWS Quick Start Templates
2 - Custom Template Location
Choice: 1
Choose an AWS Quick Start application template
1 - Hello World Example
2 - Multi-step workflow
3 - Serverless API
4 - Scheduled task
5 - Standalone function
6 - Data processing
7 - Hello World Example With Powertools
8 - Infrastructure event management
9 - Serverless Connector Hello World Example
10 - Multi-step workflow with Connectors
11 - Lambda Response Streaming
12 - Lambda EFS example
13 - DynamoDB Example
14 - Machine Learning
Template: 1
Use the most popular runtime and package type? (Python and zip) [y/N]: y
Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]: n
Would you like to enable monitoring using CloudWatch Application Insights?
For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]: n
Project name [sam-app]: sam-app
Cloning from https://github.com/aws/aws-sam-cli-app-templates (process may take a moment)
-----------------------
Generating application:
-----------------------
Name: sam-app
Runtime: python3.9
Architectures: x86_64
Dependency Manager: pip
Application Template: hello-world
Output Directory: .
Configuration file: sam-app/samconfig.toml
Next steps can be found in the README file at sam-app/README.md
Commands you can use next
=========================
[*] Create pipeline: cd sam-app && sam pipeline init --bootstrap
[*] Validate SAM template: cd sam-app && sam validate
[*] Test Function in the Cloud: cd sam-app && sam sync --stack-name {stack-name} --watch
- AWS 퀵 스타트 템플릿을 선택하여 시작 템플릿을 선택
- Hello World 예제 템플릿을 선택하고 다운로드
- Python런타임 및zip 패키지 유형을 사용
- 이 자습서에서는AWS X-Ray 추적 사용하지 않음 (자세한 내용: AWS X-Ray)
- 이 자습서에서는 Amazon CloudWatch 애플리케이션 인사이트를 통한 모니터링을 사용하지 않음(자세한 내용: Amazon CloudWatch 사용 설명서의 Amazon CloudWatch 애플리케이션 인사이트)
- 애플리케이션 이름을 sam-app으로 지정
- AWS SAMCLI는 시작 템플릿을 다운로드하고 로컬 시스템에 애플리케이션 프로젝트 디렉터리 구조를 생성
(2) 새로 만든 sam-app 디렉터리로 이동해 구조 확인
$ cd sam-app
$ tree
.
├── README.md
├── __init__.py
├── events
│ └── event.json
├── hello_world
│ ├── __init__.py
│ ├── app.py
│ └── requirements.txt
├── samconfig.toml
├── template.yaml
└── tests
├── __init__.py
├── integration
│ ├── __init__.py
│ └── test_api_gateway.py
├── requirements.txt
└── unit
├── __init__.py
└── test_handler.py
5 directories, 14 files
- hello_world/app.py— Lambda 함수 코드가 포함
- hello_world/requirements.txt— Lambda 함수에 필요한 모든Python 종속성을 포함
- samconfig.toml—AWS SAM CLI에서 사용하는 기본 매개 변수를 저장하는 애플리케이션의 구성 파일
- template.yaml— 애플리케이션 인프라 코드가 포함된AWS SAM 템플릿
2. 애플리케이션 빌드 : AWS SAM CLI를 사용하여 애플리케이션을 빌드 및 배포 준비
- 애플리케이션을 빌드하면AWS SAM CLI가.aws-sam 디렉터리를 생성하고 여기에 함수 종속성, 프로젝트 코드 및 프로젝트 파일을 구성
# 로컬 서버에 파이썬이 설치되어 있는 경우
$ sam build
Starting Build use cache
Manifest file is changed (new hash: 3298f13049d19cffaa37ca931dd4d421) or dependency folder (.aws-sam/deps/81fa3760-8b94-4bcb-b4b8-cb9d57c14f8e) is missing for (HelloWorldFunction), downloading dependencies and copying/building source
Building codeuri: /home/프로젝트 디렉토리/msa_study/HelloWorld/sam-app/hello_world runtime: python3.9 metadata: {} architecture: x86_64 functions: HelloWorldFunction
Running PythonPipBuilder:CleanUp
Running PythonPipBuilder:ResolveDependencies
Running PythonPipBuilder:CopySource
Running PythonPipBuilder:CopySource
Build Succeeded
Built Artifacts : .aws-sam/build
Built Template : .aws-sam/build/template.yaml
Commands you can use next
=========================
[*] Validate SAM template: sam validate
[*] Invoke Function: sam local invoke
[*] Test Function in the Cloud: sam sync --stack-name {{stack-name}} --watch
[*] Deploy: sam deploy --guided
# 파이썬이 설치되어있지 않을 경우 도커 컨테이너를 사용해 빌드 가능
$ sam build --use-container
Starting Build use cache
Starting Build inside a container
Cache is invalid, running build and copying resources for following functions (HelloWorldFunction)
Building codeuri: /home/프로젝트 디렉토리/msa_study/HelloWorld/sam-app/hello_world runtime: python3.9 metadata: {} architecture: x86_64 functions: HelloWorldFunction
Fetching public.ecr.aws/sam/build-python3.9:latest-x86_64 Docker container image................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Mounting /home/프로젝트 디렉토리/msa_study/HelloWorld/sam-app/hello_world as /tmp/samcli/source:ro,delegated, inside runtime container
Running PythonPipBuilder:ResolveDependencies
Running PythonPipBuilder:CopySource
Build Succeeded
Built Artifacts : .aws-sam/build
Built Template : .aws-sam/build/template.yaml
Commands you can use next
=========================
[*] Validate SAM template: sam validate
[*] Invoke Function: sam local invoke
[*] Test Function in the Cloud: sam sync --stack-name {{stack-name}} --watch
[*] Deploy: sam deploy --guided
[참고] Ubuntu 20.04.6 LTS에서 파이썬 설치하기
- apt 업데이트 후 설치에 필요한 소프트웨어가 설치되었는지 확인
$ sudo apt update $ sudo apt install software-properties-common
- deadsnakes ppa 추가
$ sudo add-apt-repository ppa:deadsnakes/ppa
- apt 다시 업데이트
$ sudo apt update
- python3.9 설치
$ sudo apt install python3.9
- 정상적으로 설치되었는지 확인 후 Python 패키지를 설치하고 관리하는 패키지 매니저(Package Manager)인 pip도 설치
$ python3.9 --version $ sudo apt update # python3의 경우 pip3 $ sudo apt update sudo apt install python3-pip $ pip3 --version pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)
(2) 애플리케이션 빌드 후 파일 확인
$ cd .aws-sam
$ tree
.
.aws-sam
├── build
│ ├── HelloWorldFunction
│ │ ├── __init__.py
│ │ ├── app.py
│ │ └── requirements.txt
│ └── template.yaml
└── build.toml
39 directories, 216 files
- build/HelloWorldFunction : Lambda 함수 코드 및 종속 항목이 포함되어 있음. AWS SAMCLI는 애플리케이션의 각 함수에 대한 디렉터리를 생성
- build/template.yaml : AWS CloudFormation 시 참조하는 AWS SAM 배포 템플릿 사본 포함
- build.toml : 애플리케이션을 구축 및 배포할 때AWS SAM CLI에서 참조하는 기본 매개 변수 값을 저장하는 구성 파일
3. AWS 클라우드에 애플리케이션 배포
이 단계에서는AWS SAM CLI를 사용하여 애플리케이션을 AWS 클라우드에 배포하며 AWS SAMCLI는 다음 작업을 수행
- 배포를 위한 애플리케이션 설정을 구성하는 과정을 안내
- Amazon Simple Storage Service (Amazon S3) 에 애플리케이션 파일을 업로드
- AWS SAM 템플릿을 AWS CloudFormation 템플릿으로 변환하고 템플릿을 AWS CloudFormation 서비스에 업로드하여 AWS 리소스를 프로비저닝
- 참고 : 이 단계에는AWS 자격 증명 구성이 필요 (자세한 내용은 AWS SAM 사전 조건에서 5단계: 를AWS CLI 사용하여AWS 자격 증명을 구성 섹션을 참조)
(1) 애플리케이션 디렉토리(현재의 경우 : sam-app)에서 sam deploy --guided 명령어를 통해 대화형 흐름을 따라 애플리케이션 배포 설정 구성
$ sam deploy --guided
Configuring SAM deploy
======================
Looking for config file [samconfig.toml] : Found
Reading default arguments : Success
Setting default arguments for 'sam deploy'
=========================================
Stack Name [sam-app]:
AWS Region [ap-northeast-2]:
#Shows you resources changes to be deployed and require a 'Y' to initiate deploy
Confirm changes before deploy [Y/n]: n
#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
#Preserves the state of previously provisioned resources when an operation fails
Disable rollback [y/N]: n
HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y
Save arguments to configuration file [Y/n]: y
SAM configuration file [samconfig.toml]: y
SAM configuration environment [default]: y
Looking for resources needed for deployment:
Creating the required resources...
- AWS CloudFormation스택 이름 설정 : 스택이란 하나의 단위로 관리할 수 있는AWS 리소스 모음(자세한 내용: AWS CloudFormation사용 설명서의 스택 사용을 참조)
- AWS 리전 : AWS CloudFormation 스택을 배포할 대상 (자세한 내용은 AWS CloudFormation사용 설명서의 AWS CloudFormation엔드포인트를 참조)
- 이 자습서에서는 배포 전에 변경 사항을 확인하지 않도록 설정
- IAM 역할 생성 허용 : 이를 통해 API Gateway 리소스와 Lambda 함수 리소스가 상호 작용하는 데 필요한 IAM 역할을AWS SAM 생성 가능
- 이 자습서에서는 롤백 비활성화를 사용하지 않음
- HelloWorldFunction 승인 없이 허용 : API Gateway 엔드포인트가 승인 없이 공개적으로 액세스할 수 있도록 구성되었기 때문이며 Hello World 애플리케이션을 위한 컨피그레이션이므로AWS SAM CLI를 계속할 수 있도록 허용(권한 부여 구성에 대한 자세한 내용: API Gateway API에 대한 액세스 제어 참조)
- 구성 파일에 설정 저장 : 애플리케이션samconfig.toml 파일이 배포 기본 설정으로 업데이트
- 기본 구성 파일 이름 선택
- 기본 구성 환경을 선택
(2) 배포 과정
Looking for resources needed for deployment:
Creating the required resources...
Successfully created!
Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-ubujxdz5rfok
A different default S3 bucket can be set in samconfig.toml and auto resolution of buckets turned off by setting resolve_s3=False
Parameter "stack_name=sam-app" in [default.deploy.parameters] is defined as a global parameter [default.global.parameters].
This parameter will be only saved under [default.global.parameters] in /home/프로젝트 디렉토리/msa_study/HelloWorld/sam-app/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 sam-app/52182b25e6a404d6c7e9f18a8cf85d8f 603576 / 603576 (100.00%)
Deploying with following values
===============================
Stack name : sam-app
Region : ap-northeast-2
Confirm changeset : False
Disable rollback : False
Deployment s3 bucket : aws-sam-cli-managed-default-samclisourcebucket-ubujxdz5rfok
Capabilities : ["CAPABILITY_IAM"]
Parameter overrides : {}
Signing Profiles : {}
Initiating deployment
=====================
Uploading to sam-app/7d74e8ab5dd9219d7212291772a1e3d1.template 1199 / 1199 (100.00%)
Waiting for changeset to be created..
CloudFormation stack changeset
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Operation LogicalResourceId ResourceType Replacement
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Add HelloWorldFunctionHelloWorldPermissionPro AWS::Lambda::Permission N/A
d
+ Add HelloWorldFunctionRole AWS::IAM::Role N/A
+ Add HelloWorldFunction AWS::Lambda::Function N/A
+ Add ServerlessRestApiDeployment47fc2d5f9d AWS::ApiGateway::Deployment N/A
+ Add ServerlessRestApiProdStage AWS::ApiGateway::Stage N/A
+ Add ServerlessRestApi AWS::ApiGateway::RestApi N/A
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Changeset created successfully. arn:aws:cloudformation:ap-northeast-2::changeSet/samcli-deploy1683596591/a5402122-cc1c-43e0-b379-132dfa2e5b9f
2023-05-09 10:43:17 - Waiting for stack create/update to complete
CloudFormation events from stack operations (refresh every 5.0 seconds)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ResourceStatus ResourceType LogicalResourceId ResourceStatusReason
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CREATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole -
CREATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole Resource creation Initiated
CREATE_COMPLETE AWS::IAM::Role HelloWorldFunctionRole -
CREATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction -
CREATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction Resource creation Initiated
CREATE_COMPLETE AWS::Lambda::Function HelloWorldFunction -
CREATE_IN_PROGRESS AWS::ApiGateway::RestApi ServerlessRestApi -
CREATE_IN_PROGRESS AWS::ApiGateway::RestApi ServerlessRestApi Resource creation Initiated
CREATE_COMPLETE AWS::ApiGateway::RestApi ServerlessRestApi -
CREATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermissionPro -
d
CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d5f9d -
CREATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermissionPro Resource creation Initiated
d
CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d5f9d Resource creation Initiated
CREATE_COMPLETE AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d5f9d -
CREATE_IN_PROGRESS AWS::ApiGateway::Stage ServerlessRestApiProdStage -
CREATE_IN_PROGRESS AWS::ApiGateway::Stage ServerlessRestApiProdStage Resource creation Initiated
CREATE_COMPLETE AWS::ApiGateway::Stage ServerlessRestApiProdStage -
CREATE_COMPLETE AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermissionPro -
d
CREATE_COMPLETE AWS::CloudFormation::Stack sam-app -
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CloudFormation outputs from deployed stack
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Outputs
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Key HelloWorldFunctionIamRole
Description Implicit IAM Role created for Hello World function
Value arn:aws:iam:::role/sam-app-HelloWorldFunctionRole-1WX6C1INS3258
Key HelloWorldApi
Description API Gateway endpoint URL for Prod stage for Hello World function
Value https://.execute-api.ap-northeast-2.amazonaws.com/Prod/hello/
Key HelloWorldFunction
Description Hello World Lambda Function ARN
Value arn:aws:lambda:ap-northeast-2::function:sam-app-HelloWorldFunction-OIA5Ae8wpZnU
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Successfully created/updated stack - sam-app in ap-northeast-2
- AWS SAM CLI는 Amazon S3 버킷을 생성하고.aws-sam 디렉터리를 업로드
- AWS SAM CLI는 AWS SAM 템플릿을 AWS CloudFormation 서비스로 변환하여 AWS CloudFormation 서비스에 업로드
- AWS CloudFormation자원을 공급
4. 애플리케이션 실행
CloudFormation outputs from deployed stack
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Outputs
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Key HelloWorldFunctionIamRole
Description Implicit IAM Role created for Hello World function
Value arn:aws:iam:::role/sam-app-HelloWorldFunctionRole-1WX6C1INS3258
Key HelloWorldApi
Description API Gateway endpoint URL for Prod stage for Hello World function
Value https://.execute-api.ap-northeast-2.amazonaws.com/Prod/hello/
Key HelloWorldFunction
Description Hello World Lambda Function ARN
Value arn:aws:lambda:ap-northeast-2::function:sam-app-HelloWorldFunction-OIA5Ae8wpZnU
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(1-2) 애플리케이션 디렉토리(현재의 경우 : sam-app)에서 sam list endpoints --output json 명령을 사용해 엔드포인트 확인
$ sam list endpoints --output json
[
{
"LogicalResourceId": "HelloWorldFunction",
"PhysicalResourceId": "sam-app-HelloWorldFunction-OIA5Ae8wpZnU",
"CloudEndpoint": "-",
"Methods": "-"
},
{
"LogicalResourceId": "ServerlessRestApi",
"PhysicalResourceId": "",
"CloudEndpoint": [
"https://.execute-api.ap-northeast-2.amazonaws.com/Prod",
"https://.execute-api.ap-northeast-2.amazonaws.com/Stage"
],
"Methods": [
"/hello['get']"
]
}
]
(2) curl 또는 브라우저로 접속해 정상적으로 동작하는지 확인
$ curl https://.execute-api.ap-northeast-2.amazonaws.com/Prod/hello/
{"message": "hello world"}
5. 애플리케이션 수정 및 AWS 클라우드 동기화
- AWS SAM CLI는 개발 스택을 동기화하고 있는지 확인하는 메시지를 표시하므로 sam sync --watch 명령은 로컬 변경 내용을 AWS 클라우드 실시간으로 자동 배포하므로 개발 환경에서만 사용하기를 권장
(1) 애플리케이션 디렉토리(현재의 경우 : sam-app)에서 sam sync --watch 명령어로 aws 클라우드와 동기화
- AWS SAM CLI는 로컬 변경 모니터링을 시작하기 전에 초기 배포를 수행
$ sam sync --watch
The SAM CLI will use the AWS Lambda, Amazon API Gateway, and AWS StepFunctions APIs to upload your code without
performing a CloudFormation deployment. This will cause drift in your CloudFormation stack.
**The sync command should only be used against a development stack**.
Queued infra sync. Waiting for in progress code syncs to complete...
Starting infra sync.
Manifest is not changed for (HelloWorldFunction), running incremental build
Building codeuri: /home/프로젝트 디렉토리/msa_study/HelloWorld/sam-app/hello_world runtime: python3.9 metadata: {} architecture: x86_64 functions: HelloWorldFunction
Running PythonPipBuilder:CopySource
Build Succeeded
Successfully packaged artifacts and wrote output template to file /tmp/tmpfx8yzj5c.
Execute the following command to deploy the packaged template
sam deploy --template-file /tmp/tmpfx8yzj5c --stack-name <YOUR STACK NAME>
Deploying with following values
===============================
Stack name : sam-app
Region : ap-northeast-2
Disable rollback : False
Deployment s3 bucket : aws-sam-cli-managed-default-samclisourcebucket-ubujxdz5rfok
Capabilities : ["CAPABILITY_NAMED_IAM", "CAPABILITY_AUTO_EXPAND"]
Parameter overrides : {}
Signing Profiles : null
Initiating deployment
=====================
2023-05-09 11:19:43 - Waiting for stack create/update to complete
CloudFormation events from stack operations (refresh every 0.5 seconds)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ResourceStatus ResourceType LogicalResourceId ResourceStatusReason
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
UPDATE_IN_PROGRESS AWS::CloudFormation::Stack sam-app Transformation succeeded
CREATE_IN_PROGRESS AWS::CloudFormation::Stack AwsSamAutoDependencyLayerNestedStack -
CREATE_IN_PROGRESS AWS::CloudFormation::Stack AwsSamAutoDependencyLayerNestedStack Resource creation Initiated
CREATE_COMPLETE AWS::CloudFormation::Stack AwsSamAutoDependencyLayerNestedStack -
UPDATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction -
UPDATE_COMPLETE AWS::Lambda::Function HelloWorldFunction -
UPDATE_COMPLETE_CLEANUP_IN_PROGRESS AWS::CloudFormation::Stack sam-app -
UPDATE_COMPLETE AWS::CloudFormation::Stack sam-app -
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CloudFormation outputs from deployed stack
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Outputs
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Key HelloWorldFunctionIamRole
Description Implicit IAM Role created for Hello World function
Value arn:aws:iam:::role/sam-app-HelloWorldFunctionRole-1WX6C1INS3258
Key HelloWorldApi
Description API Gateway endpoint URL for Prod stage for Hello World function
Value https://.execute-api.ap-northeast-2.amazonaws.com/Prod/hello/
Key HelloWorldFunction
Description Hello World Lambda Function ARN
Value arn:aws:lambda:ap-northeast-2::function:sam-app-HelloWorldFunction-OIA5Ae8wpZnU
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Stack update succeeded. Sync infra completed.
CodeTrigger not created as CodeUri or DefinitionUri is missing for ServerlessRestApi.
Infra sync completed.
(2) Lambda 함수 코드를 수정하고 실시간으로 AWS SAM CLI가 변경 사항을 자동으로 감지하고 AWS 클라우드에 애플리케이션을 동기화하는지 확인
(3) curl 또는 브라우저로 수정된 내용이 정상적으로 반영되었는지 확인
6. (Optional) 로컬에서 애플리케이션 테스트
- 참고: AWS SAM CLI를 로컬 테스트에 사용하려면Docker 설치 및 구성해야함(자세한 내용 : Docker 설치 참조)
(1) 애플리케이션 디렉토리(현재의 경우 : sam-app)에서 Lambda 함수를 위한 로컬 환경을 호스팅하고 Lambda 함수 호출
- AWS SAMCLI는 로컬Docker 컨테이너를 생성하고 함수를 호출 다음은 예제 출력
$ sam local invoke
Invoking app.lambda_handler (python3.9)
Local image was not found.
Removing rapid images for repo public.ecr.aws/sam/emulation-python3.9
Building image............................................................................................................................................................................................................................................................................................................................................................
Using local image: public.ecr.aws/lambda/python:3.9-rapid-x86_64.
Mounting /home/프로젝트 디렉토리/msa_study/HelloWorld/sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container
START RequestId: 85c39a9a-202a-41f7-bd7c-ee5781aa1548 Version: $LATEST
{"statusCode": 200, "body": "{\"message\": \"hello world\"}"}END RequestId: 85c39a9a-202a-41f7-bd7c-ee5781aa1548
REPORT RequestId: 85c39a9a-202a-41f7-bd7c-ee5781aa1548 Init Duration: 0.29 ms Duration: 169.86 ms Billed Duration: 170 ms Memory Size: 128 MB Max Memory Used: 128 MB
(2) 애플리케이션 디렉토리(현재의 경우 : sam-app)에서 API를 로컬 호스팅
$ sam local start-api
Initializing the lambda functions containers.
Local image is up-to-date
Using local image: public.ecr.aws/lambda/python:3.9-rapid-x86_64.
Mounting /home/프로젝트 디렉토리/msa_study/HelloWorld/sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container
Containers Initialization is done.
Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]
You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. If you used sam build before running local commands, you will need to re-run sam build for the changes to be picked up. You only need to restart SAM CLI if you update your AWS SAM template
2023-05-09 11:44:16 WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:3000
2023-05-09 11:44:16 Press CTRL+C to quit
Invoking app.lambda_handler (python3.9)
Reuse the created warm container for Lambda function 'HelloWorldFunction'
Lambda function 'HelloWorldFunction' is already running
(3) 정상적으로 로컬에서 동작하는지 확인
$ curl http://localhost:3000/hello
{"message": "hello world"}
$ curl http://127.0.0.1:3000/hello
{"message": "hello world"}
Reuse the created warm container for Lambda function 'HelloWorldFunction'
Lambda function 'HelloWorldFunction' is already running
START RequestId: 6c2607c1-a089-44b9-805e-bc40f536bae0 Version: $LATEST
END RequestId: 6c2607c1-a089-44b9-805e-bc40f536bae0
REPORT RequestId: 6c2607c1-a089-44b9-805e-bc40f536bae0 Init Duration: 0.29 ms Duration: 137.41 ms Billed Duration: 138 ms Memory Size: 128 MB Max Memory Used: 128 MB
No Content-Type given. Defaulting to 'application/json'.
2023-05-09 11:44:44 127.0.0.1 - - [09/May/2023 11:44:44] "GET /hello HTTP/1.1" 200 -
Invoking app.lambda_handler (python3.9)
Reuse the created warm container for Lambda function 'HelloWorldFunction'
Lambda function 'HelloWorldFunction' is already running
START RequestId: 68c9edd9-3038-474e-bd76-0f7fe4ddeef9 Version: $LATEST
END RequestId: 68c9edd9-3038-474e-bd76-0f7fe4ddeef9
REPORT RequestId: 68c9edd9-3038-474e-bd76-0f7fe4ddeef9 Duration: 3.55 ms Billed Duration: 4 ms Memory Size: 128 MB Max Memory Used: 128 MB
No Content-Type given. Defaulting to 'application/json'.
2023-05-09 11:46:35 127.0.0.1 - - [09/May/2023 11:46:35] "GET /hello HTTP/1.1" 200 -
7. AWS 클라우드에서 애플리케이션 삭제
- 애플리케이션의 Amazon S3 버킷과AWS CloudFormation 스택이 삭제됨
(1) 애플리케이션 디렉토리(현재의 경우 : sam-app)에서 애플리케이션 삭제
$ sam delete
Are you sure you want to delete the stack sam-app in the region ap-northeast-2 ? [y/N]: y
Do you want to delete the template file 6d2bd5267ab4e68c203d707742074b7b.template in S3? [y/N]: y
- Deleting S3 object with key c6ce8fa8b5a97dd022ecd006536eb5a4
- Deleting S3 object with key 841d889d1b7a220b7bd81faa7d788d9d.template
- Deleting S3 object with key 6d2bd5267ab4e68c203d707742074b7b.template
- Deleting Cloudformation stack sam-app
Deleted successfully
# References
- https://opensource.com/article/20/4/install-python-linux
- https://askubuntu.com/questions/1318846/how-do-i-install-python-3-9
- SAM 세션
'devops bootcamp 4 > DevOps 인프라 관리' 카테고리의 다른 글
[Infrastructure as Code] 02. Terraform (0) | 2023.05.12 |
---|---|
[Infrastructure as Code] 01. Infrastructure as Code (코드형 인프라) (1) | 2023.05.12 |
[마이크로서비스 작성] 01. 독립적인 서비스 구성 (1) | 2023.05.09 |
[마이크로서비스] 04. CQRS (0) | 2023.05.08 |
[마이크로서비스] 03. API 디자인과 프로세스 간 통신 (1) | 2023.05.08 |