티스토리 뷰

AWS

AWS SAM 시작하기

siyoon210 2022. 7. 24. 16:08
반응형

본 포스팅은 AWS 공식 문서 내용을 정리 & 자체번역 한 내용입니다. (이후 공식 번역이 지원되는 경우 공식 문서를 참고바랍니다.)


AWS SAM은 쉽게 서버리스 애플리케이션을 구성하고 관리 할 수 있는 AWS SAM CLI 커맨드 라인 툴을 제공합니다. AWS SAM CLI를 사용하기 위해서는 몇가지 설치와 설정이 필요합니다.

 

macOS에서 AWS SAM CLI 설치하기

 AWS CLI를 사용하기 위해서는 사전 요구사항을 설치하고 구성해야합니다.

  1. AWS 계정 생성
  2. AWS Identity and Access Management (IAM), AWS credentials 설정
  3. 도커(Docker) 설치 (참고: 도커는 --use-container 옵션을 사용하여 로컬환경에서 테스트 할때 사용됩니다.)
  4. Homebrew 설치
  5. 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에서 동작하기 위한 도커 설치 및 설정 방법입니다.

 

  1. 도커 설치
    AWS SAM CLI는 macOS Sierra 10.12 이상을 지원합니다. 도커를 설치하려면 다음 링크 참고 Install Docker Desktop for Mac
  2. Shared drives 설정
    AWS SAM CLI는 shared drive에 존재하는 프로젝트의 디렉토리와 모든 상위 디렉토리가 필요합니다. macOS에서 share drive 설정을 하기 위해서는 다음 링크 참고 File sharing
  3. 설치 검증
    도커가 설치된 이후로는 제대로 동작하는지 확인합니다. 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 IDsecret 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 튜토리얼을 참고

반응형
댓글