티스토리 뷰
본 포스팅은 AWS 공식 문서 내용을 정리 & 자체번역 한 내용입니다. (이후 공식 번역이 지원되는 경우 공식 문서를 참고바랍니다.)
AWS SAM은 쉽게 서버리스 애플리케이션을 구성하고 관리 할 수 있는 AWS SAM CLI 커맨드 라인 툴을 제공합니다. AWS SAM CLI를 사용하기 위해서는 몇가지 설치와 설정이 필요합니다.
macOS에서 AWS SAM CLI 설치하기
AWS CLI를 사용하기 위해서는 사전 요구사항을 설치하고 구성해야합니다.
- AWS 계정 생성
- AWS Identity and Access Management (IAM), AWS credentials 설정
- 도커(Docker) 설치 (참고: 도커는 --use-container 옵션을 사용하여 로컬환경에서 테스트 할때 사용됩니다.)
- Homebrew 설치
- AWS SAM CLI 설치
스텝 1. AWS 계정 생성
aws.amazon.com 에서 계정 생성
스텝 2. AWS IAM 권한 및 AWS credentials 설정
AWS SAM을 위한 IAM 설정은 AWS 서비스 호출과 AWS 리소스 관리를 위한 충분한 권한이 있어야 합니다. 가장 간단한 방법으로는 관리자 권한(administrator privileges)을 주는 것입니다. 더 자세한 정보는 Creating your first IAM admin user and group 참고.
스텝 3. 도커(Docker) 설치 (선택사항)
(도커는 --use-container 옵션을 사용하여 로컬환경에서 테스트 할때 사용됩니다.)
도커는 macOS 머신에서 컨테이너를 실행하기 위한 애플리케이션입니다. AWS SAM은 도커 컨테이너를 사용하여 AWS Lambda와 유사한 로컬 환경을 제공합니다. 이 컨테이너를 사용하여 서비리스 애플리케이션의 빌드, 테스트, 디버그를 수행 할 수 있습니다.
AWS SAM CLI를 사용하여 서버리스 프로젝트를 실행하기 위해서는 도커가 설치되어 있어야 합니다. AWS SAM CLI는 DOCKER_HOST 환경 변수를 사용하여 도커 데몬에 접촉합니다. 다음 단계들은 AWS SAM CLI에서 동작하기 위한 도커 설치 및 설정 방법입니다.
- 도커 설치
AWS SAM CLI는 macOS Sierra 10.12 이상을 지원합니다. 도커를 설치하려면 다음 링크 참고 Install Docker Desktop for Mac - Shared drives 설정
AWS SAM CLI는 shared drive에 존재하는 프로젝트의 디렉토리와 모든 상위 디렉토리가 필요합니다. macOS에서 share drive 설정을 하기 위해서는 다음 링크 참고 File sharing - 설치 검증
도커가 설치된 이후로는 제대로 동작하는지 확인합니다. docker ps와 같은 도커 명령어를 사용하여 도커가 제대로 설치 되었는지도 확인합니다. 필요한 컨테이너가 있는 경우 AWS CLI가 자동으로 install, fetch, pull을 수행하니 직접 수행하지 않아도 됩니다.
도커 설치시에 이슈가 있는 경우 다음 링크 참고 Logs and troubleshooting
스텝 4. Homebrew 설치
AWS SAM CLI를 macOS에 설치하기 위해서 권장되는 방식은 Homewbrew 패키지 매니저를 사용하는 것입니다. Homebrew에 대한 자세한 정보는 다음 링크 참고 Homebrew Documentation
Homewbrew를 설치하기 위해서는 Git을 먼저 설치해야 합니다. Git에 대한 자세한 정보는 다음 링크 참고 Git Documentation. Git은 macOS를 포함하여 대다수의 OS에서 사용 가능합니다. Git 설치에 대한 자세한 내용은 다음 링크 참고 Installing Git
Git을 성공적으로 설치하였으면, 터미널에서 다음 명령을 실행하여 Homewbrew를 설치합니다.
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
Homewbrew가 설치되었다면 다음 명령어로 검증합니다.
brew --version
성공적으로 Homewbrew가 설치 되었다면 아래와 같은 메시지를 확인 할 수 있습니다.
Homebrew 2.5.7
Homebrew/homebrew-core (git revision 1be3ad; last commit 2020-10-29)
Homebrew/homebrew-cask (git revision a0cf3; last commit 2020-10-29)
스텝5. AWS SAM CLI 설치하기
Homewbrew를 사용하여 AWS SAM CLI를 설치합니다
brew tap aws/tap
brew install aws-sam-cli
설치 확인은 아래 명령어로 확인:
sam --version
정상적으로 AWS SAM CLI가 설치되었다면 아래와 같은 메시지를 확인 할 수 있습니다.
SAM CLI, version 1.35.0
업그레이드
Homebrew를 사용하여서 AWS SAM CLI를 업그레이드 하고 싶다면, 다음 명령어를 입력합니다.
brew upgrade aws-sam-cli
제거
Homewbrew를 사용하여서 AWS SAM CLI를 제거하고 싶다면, 다음 명령어를 입력합니다.
brew uninstall aws-sam-cli
Nightly build (실시간 업데이트 버전 빌드)
AWS SAM CLI는 nightly build(실시간 업데이트 버전 빌드)를 지원합니다. 설치 이후에, sam-nightly 명령어로 설정합니다. 일반적인 상용(production) 버전과 nightly build 버전을 동시에 사용하는 것도 가능합니다.
nightly build는 상용 버전에 배포되지 않는 코드를 포함하기 때문에 안정성이 떨어집니다. 그리고 --use-container 옵션을 사용하여서 서버리스 애플리케이션 빌드하는 경우는 최신 상용버전 이미지를 사용하기 때문에 주의가 필요합니다.
nightly build를 설치하기 위해서는 다음 명령어를 실행합니다.
brew tap aws/tap
brew install aws-sam-cli-nightly
정상적으로 설치되었는지 확인하기 위해서는 sam-nightly --version 명령어를 사용합니다. 출력 메시지는 1.X.Y.dev<YYYYMMDDHHmm> 같은 폼으로 나타납니다.
SAM CLI, version 1.20.0.dev202103151200
AWS 자격 증명(credential) 설정하기
AWS SAM CLI로 AWS 서비스를 사용하기 위해서 AWS 자격 증명 설정이 필요합니다. 예를들어 AWS SAM CLI로 AWS S3나 CloudFormation을 호출하는 경우에 사용됩니다.
이전에 AWS SDK나 AWS CLI와 같은 툴을 사용한적이 있다면 이미 설정되어 있겠지만, 그렇지 않다면 이 가이드를 참고하여서 적절한 AWS 자격 증명 설정을 할 수 있습니다.
AWS 자격증명을 하기 위해서는 설정을 원하는 IAM의 access key ID와 secret access key가 필요합니다. 이와관련한 정보를 원한다면 다음 링크를 참고 Managing Access Keys for IAM Users
다음으로 AWS CLI가 설치되어 있는지 확인하고, 다음 섹션을 중 하나를 수행합니다.
AWS CLI가 설치되어 있는 경우
AWS CLI가 설치되어 있다면 aws configure 명령어를 사용하고 다음과 같이 입력합니다.
$ aws configure
AWS Access Key ID [None]: your_access_key_id
AWS Secret Access Key [None]: your_secret_access_key
Default region name [None]:
Default output format [None]:
aws configure 명령어에 대해서 자세한 정보를 원한다면 다음 링크를 참고 Quickly Configuring the AWS CLI
AWS CLI가 설치되어 있지 않은 경우
AWS CLI가 설치되어 있지 않다면 자격증명 파일(credentials file)을 사용하거나 환경 변수를 사용하여서 설정 할 수 있습니다.
자격증명 파일(credentials file)를 사용하는 방법 - Local 시스템에서 AWS 자격증명 파일을 사용하여 설정 할 수 있습니다. 이 파일은 리눅스 혹은 맥인 경우 ~/.aws/credentials 에 위치해야 하며 윈도우인 경우 C:\Users\USERNAME\.aws\credentials에 위치해야 합니다.
이 파일은 다음과 같은 포맷으로 작성해야합니다.
[default]
aws_access_key_id = your_access_key_id
aws_secret_access_key = your_secret_access_key
환경 변수를 사용하는 방법 - AWS_ACCESS_KEY_ID 와 AWS_SECRET_ACCESS_KEY 환경 변수를 설정합니다.
리눅스나 맥인 경우 export 커맨드를 사용합니다.
export AWS_ACCESS_KEY_ID=your_access_key_id
export AWS_SECRET_ACCESS_KEY=your_secret_access_key
윈도우인 경우 set 명령어를 사용합니다.
set AWS_ACCESS_KEY_ID=your_access_key_id
set AWS_SECRET_ACCESS_KEY=your_secret_access_key
튜토리얼 : Hello World 애플리케이션 배포
이 가이드에서는 샘플 Hello World 애플리케이션을 다운로드, 빌드, 배포를 진행합니다. AWS 클라우드에서 테스트 해볼 수 있고 원하는 경우 로컬 환경에서도 테스트할 수 있습니다.
샘플 애플리케이션은 Amazon API Gateway와 AWS Lambda로 구성된 기본적인 백엔드 API로 구성되어 있습니다. API Gateway를 통해 GET 요청을 보내면 Lambda 함수가 호출되고 이 Lambda 함수는 hello world라는 메세지를 반환니다.
다음 다이어그램은 샘플 애플리케이션의 구성을 보여줍니다.
샘플 애플리케이션을 초기화할때 Lambda 배포 패키지 타입(Zip이나 Image)을 선택할 수 있습니다. 패키지 타입에 대한 자세한 설명은 다음 링크 참고 Lambda deployment packages
아래 내용은 Hello World 애플리케이션을 만드는 커맨드 입니다. 커맨드들의 자세한 내용은 다음 섹션에서 설명합니다.
#Step 1 - 샘플 애플리케이션 다운로드
sam init
#Step 2 - 애플리케이션 빌드
cd sam-app
sam build
#Step 3 - 애플이케이션 배포
sam deploy --guided
사전 조건
이 가이드는 AWS SAM CLI가 설치되었다고 가정합니다.
1. AWS 계정 생성
2. AWS Identity and Acccess Management(IAM) 권한 설정
3. 도커 설치 참고: 로컬 테스트 시에만 사용
4. Homebrew 설치 참고: Linux와 macOS인 경우만 사용
5. AWS SAM CLI 설치 참고 : 1.13.0 이상 버전 사용 sam --version으로 버전 확인 가능
스텝1 : AWS SAM 애플리케이션 다운로드
실행할 명령 :
sam init
화면에 포기되는 프롬프트를 확인합니다. 이 가이드에서는 AWS Quick Start Templates, Zip 패키지 타입, 실습하기 원하는 runtime, Hello World Example을 권합니다.
출력 예제:
-----------------------
Generating application:
-----------------------
Name: sam-app
Runtime: python3.7
Dependency Manager: pip
Application Template: hello-world
Output Directory: .
Next steps can be found in the README file at ./sam-app/README.md
AWS SAM이 하는 것:
입력한 프로젝트 이름으로 디렉토리를 생성합니다. 해당 디렉토리의 컨텐츠는 다음과 유사하게 만들어 집니다.
sam-app/
├── README.md
├── events/
│ └── event.json
├── hello_world/
│ ├── __init__.py
│ ├── app.py #Contains your AWS Lambda handler logic.
│ └── requirements.txt #Contains any Python dependencies the application requires, used for sam build
├── template.yaml #Contains the AWS SAM template defining your application's AWS resources.
└── tests/
└── unit/
├── __init__.py
└── test_handler.py
참고: 위 프로젝트 샘플은 Python runtime에 Hello World Example을 선택한 경우 입니다.
특히 중요한 세가지 파일이 있습니다.
- template.yaml : AWS 리소스를 정의하는 AWS SAM 템플릿입니다.
- hello_world/app.py : 실제 Lambda 함수를 포함합니다.
- hello_world/requirements.txt : sam build시에 사용할 애플리케이션에 필요한 모든 파이썬 종석성을 관리합니다. (노드로 선택한 경우 package.json)
스텝2 애플리케이션 빌드
실행할 명령:
먼저 template.yaml 파일이 위치한 프로젝트 디렉토리로 이동합니다. (디펄트 값으로 이 디렉토리는 sam-app으로 되어있음) 그리고 다음 명령어를 실행합니다.
sam build
출력 예제:
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
AWS SAM이 하는 것:
종속성 관리를 위한 추상화된 Lambda 함수가 제공하며, 패키징과 배포를 위해서 모든 소스코드들을 스테이징 폴더에 복사해둡니다. sam build 명령어는 애플리케이션을 .aws-sam/build 폴더 아래에 압축하고 Lambda에 업로드 할 수 있도록 합니다.
.aws-sam 폴더 아래에 다음과 같은 구조로 표기됩니다.
.aws-sam/
└── build/
├── HelloWorldFunction/
└── template.yaml
HelloWorldFunction은 app.py와 써드파티 종속성이 포함된 디렉토리 입니다.
스텝3 AWS 클라우드에 애플리케이션 배포하기
실행할 명령어:
sam deploy --guided
화면에 표시되는 프롬프트를 다릅니다.
참고: HelloWorldFunction may not have authorization defined, Is this okay? [y/N] 프롬프트는 AWS SAM 샘플 애플리케이션이 권한 부여 없이 API Gateway API를 구성합니다. 샘플 애플리케이션이 배포할때 AWS SAM은 공개된 URL을 생성합니다. 프롬프트에 "Y"로 응답한경우 알림을 확인할 수 있습니다. 권한 설정에 대한 자세한 내용은 다음 링크 참고 Controlling access to API Gateway APIs
출력 예제:
Deploying with following values
===============================
Stack name : sam-app
Region : us-east-1
Confirm changeset : False
Deployment s3 bucket : sam-bucket
Capabilities : ["CAPABILITY_IAM"]
Parameter overrides : {}
Initiating deployment
=====================
Waiting for changeset to be created..
CloudFormation stack changeset
---------------------------------------------------------------------------------------------------------------------------------------------------
Operation LogicalResourceId ResourceType
---------------------------------------------------------------------------------------------------------------------------------------------------
+ Add HelloWorldFunctionHelloWorldPermissionProd AWS::Lambda::Permission
+ Add ServerlessRestApiDeployment47fc2d5f9d AWS::ApiGateway::Deployment
+ Add ServerlessRestApiProdStage AWS::ApiGateway::Stage
+ Add ServerlessRestApi AWS::ApiGateway::RestApi
* Modify HelloWorldFunctionRole AWS::IAM::Role
* Modify HelloWorldFunction AWS::Lambda::Function
---------------------------------------------------------------------------------------------------------------------------------------------------
2019-11-21 14:33:24 - Waiting for stack create/update to complete
CloudFormation events from changeset
-------------------------------------------------------------------------------------------------------------------------------------------------
ResourceStatus ResourceType LogicalResourceId ResourceStatusReason
-------------------------------------------------------------------------------------------------------------------------------------------------
UPDATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole -
UPDATE_COMPLETE AWS::IAM::Role HelloWorldFunctionRole -
UPDATE_IN_PROGRESS AWS::Lambda::Function HelloWorldFunction -
UPDATE_COMPLETE AWS::Lambda::Function HelloWorldFunction -
CREATE_IN_PROGRESS AWS::ApiGateway::RestApi ServerlessRestApi -
CREATE_COMPLETE AWS::ApiGateway::RestApi ServerlessRestApi -
CREATE_IN_PROGRESS AWS::ApiGateway::RestApi ServerlessRestApi Resource creation Initiated
CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d5 Resource creation Initiated
f9d
CREATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermis Resource creation Initiated
sionProd
CREATE_IN_PROGRESS AWS::Lambda::Permission HelloWorldFunctionHelloWorldPermis -
sionProd
CREATE_IN_PROGRESS AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d5 -
f9d
CREATE_COMPLETE AWS::ApiGateway::Deployment ServerlessRestApiDeployment47fc2d5 -
f9d
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 HelloWorldFunctionHelloWorldPermis -
sionProd
UPDATE_COMPLETE_CLEANUP_IN_PROGRES AWS::CloudFormation::Stack sam-app -
S
UPDATE_COMPLETE AWS::CloudFormation::Stack sam-app -
-------------------------------------------------------------------------------------------------------------------------------------------------
Stack sam-app outputs:
---------------------------------------------------------------------------------------------------------------------------------------------------
OutputKey-Description OutputValue
---------------------------------------------------------------------------------------------------------------------------------------------------
HelloWorldFunctionIamRole - Implicit IAM Role created for Hello World arn:aws:iam::123456789012:role/sam-app-
function HelloWorldFunctionRole-104VTJ0TST7M0
HelloWorldApi - API Gateway endpoint URL for Prod stage for Hello World https://0ks2zue0zh.execute-api.us-east-1.amazonaws.com/Prod/hello/
function
HelloWorldFunction - Hello World Lambda Function ARN arn:aws:lambda:us-east-1:123456789012:function:sam-app-
HelloWorldFunction-1TY92MJX0BXU5
---------------------------------------------------------------------------------------------------------------------------------------------------
Successfully created/updated stack - sam-app in us-east-1
AWS SAM이 하는 것:
AWS 클라우드에 배포합니다. sam build 명령어로 구성된 아티팩트를 가져와서 Amazon Simple Storage Service(Amazon S3)에 업로드하고 AWS CloudFormation을 사용하여 배포를 진행합니다. sam deploy 명령의 출력문에서 AWS CloudFormation 스택에 대한 변경 사항을 볼 수 있습니다.
HTTP 엔드포인트가 생성된 경우, sam deploy 출력문에서 엔드포인트 URL을 표기합니다. curl 커맨드를 사용해서 애플리케이션에 요청을 확인해 볼 수 있습니다.
curl https://<restapiid>.execute-api.us-east-1.amazonaws.com/Prod/hello/
애플리케이션이 성공적으로 배포 되었다면 다음과 같은 출력을 확인 할 수 있습니다.
{"message": "hello world"}
명령어가 정상적으로 표기되면 curl 을 사용하여 배포된 AWS Lambda 함수를 호출 할 수 있습니다. 만약 호출이 정상적을 되지 않는다면 Troubleshooting 튜토리얼을 참고
'AWS' 카테고리의 다른 글
AWS Serverless Application Model이란 무엇인가? (AWS SAM) (0) | 2022.07.24 |
---|---|
AWS 청구비용 환불 신청하기 (2) | 2022.02.06 |
AWS Lambda에서 AWS SQS 실행하기 (Node.js) (0) | 2021.08.16 |
Spring Cloud Function 프로젝트 AWS Lambda에 배포하기 (0) | 2021.05.23 |