• AWS SAM 이란?
    • AWS 상에 'Serverless Application' 의 (빌드, 배포 등등을 정의하는) 명세서?
    • AWS CloudFormation이... '서버리스 환경' 에 더 집중된 형태로~ 확장된 것.
    • (내부적으로 SAM Template이 -> CloudFormation Template으로 변환되어 처리)
  • 원서
    • https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html
    • 0) What is SAM?
      • 음... 일단, 'Serverless Application' 란? "Lambda함수+event소스+etc리소스" 의 조합이라 볼수있다.
      • 즉, SAM은 이런 'Serverless Application' 을 정의하고 관리하는 서비스라 보면 될것이다.
        • SAM Template : JSON 혹은 YAML 을 형식으로... func, API, permission, config, event 등을 정의.
        • SAM CLI : 템플릿을 빌드, 실행, 디버그, 로컬테스트, 패키징, 배포 등등을 하는 tool
      • SAM 좋은점 :
        • Single-deployment configuration : ...
        • Extension of AWS CloudFormation : ...
        • Built-in best practices : ...
        • Local debugging and testing : ...
        • Deep integration with development tools : ...
    • 0) 설치 및 셋팅
      • AWS SAM CLI : brew tap aws/tap , brew install aws-sam-cli , brew upgrade aws-sam-cli , sam --version
      • credentials : aws-cli 의 configure 커맨드로, IAM에서 발급한 key를 셋팅 해두면 됨.
    • 1) SAM 스펙
      • 앞서 말했듯이, 'Serverless Application'을 명시하는 것.
      • AWS CloudFormation에서 Serverless에 맞게 특화하여, 더 쉽게 쓸수있도록~ 컴포넌트가 추가되는 등 확장됨. 
      • SAM Tamplate 해부
      • (CloudFormation Template 구조를 거의 따른다고 보면 되고... 다른점은 아래와 같다.)
        • Transfrom 선언 : SAM Tamplate 규격(AWS::Serverless-2016-10-31) 이라고 필수적으로 해줘야...
        • Globals 섹션 : SAM 에서만 지원하고~ 여기의 property값들이 하위 리소스에서 공통으로 사용됨.
        • Resources 섹션 : SAM 리소스 및 CloudFormation 리소스의 조합으로 구성됨.
        • Parameters 섹션 : 선연된 Object 가 "sam deploy --guided" 명령시, 추가적인 프롬프트로 표시됨.
        • Transform: AWS::Serverless-2016-10-31 (필수)
             // CloudFormation을 SAM으로 변환하는 의미?
             // CloudFormation에서는 그런의미로 필수가아님.
          
          Globals:
             // 특정 property를 셋팅하고~ 
             // 이는 Function, API, SimpleTable에서 상속받아 공통으로 사용.
             // CloudFormation에서는 이에 상응하는 섹션 없음.
          
          Description:
             // 본 SAM을 설명하는 글을 작성.
          
          Metadata:
             // 템플릿의 별도에 메타데이터를 작성. 
          
          Parameters:
             // 템플릿 런타임(스택생성or수정)시, 전달할수있는 파라미터 값.
             // Resource 나 Output 섹션에서 파라미터를 사용할수있음.
             // --parameter-overrides 커맨드 옵션 활용.
          
          Mappings:
             // 특정 조건에 사용될수있는, Key:Value 맵핑 
             // Resource 나 Output 섹션에서, Fn::FindInMap 같은 내장함수로 특정 Key의 Value를 사용.
          
          Conditions:
             // 특정 리소스가 생성되었는지? 제어를 할수있는 조건문
             // stack 생성or수정시, 특정 리소스property에 값이 할당되었는지? 제어할수있는 조건문
             // 예를들면, prod 및 test 환경에 따라~ 조건적으로 리소스 생성 가능.
          
          Resources: (필수)
             // stack 리소스와 그의 property를 명시함.
             // 예) EC2 혹은 S3 같은것들
             // Resource 나 Output 섹션에서 리소스로 사용할수있음.
             // CloudFormation 지원 리소스뿐만 아니라, SAM에서 지원하는 리소스들로 조합.
          
          Outputs:
             // stack의 property들을 볼때, 반환되는 값을 작성.
             // 예를들면, 특정 리소스명을 선언하고~ AWS CLI 커맨드로 확인가능.
             // CloudFormation를 기반으로 "파이프라인"을 구성할때 쓰면 될 것 같다. (스택 출력 값 활용?)
             // 단순 SAM 단일 배포(?) 일때는... 별로 쓸일이없는거 같다.
      • Globlas
        • AWS::Serverless::Function
        • AWS::Serverless::Api
        • AWS::Serverless::HttpApi
        • AWS::Serverless::SimpleTable 에 관해서~ 공통 설정값을 정의...
        • (override 정책 : 단일값=replace , Map값=merged , List값=addtive)
      • Resource의 종류(type) 와 그 특성(properties)
        • AWS::Serverless::Api
          • 리소스로 API Gateway가 및 (HTTPS endpoints 으로써 호출되는) Method가 생성된다.
          • 참고로, Api는 꼭 Template에 명시할 필요는 없다. 왜냐하면 Function의 'Events'으로 묵시적 처리도 된다.
          • (난... 명시적인게 좋은데... ㅎㅎㅎ)
        • AWS::Serverless:HttpApi
          • 리소스로 API Gateway : HTTP API 가 생성된다.
          • API Gateway 차원에서 (저지연 저비용) RESTful API 만들기 쉽게 해주는게 있다.
        •  AWS::Serverless::Application
          • SAR 또는 S3버킷에 존재하는 'serverless application' 을 Nested-Application으로써 임베딩 합니다.
          • 이런 Nested-Application은 nested AWS::CloudFormation::Stack 리소스로 배포 됩니다.
        • AWS::Serverless::Function
          • 리소스로 'Lambda 함수' 및 'IAM 실행Role' 및 'Event Trigger' 가 생성된다. 
          • Metadata 섹션의 특정값을 지정해서... "SAM 빌드"에 커스텀 지시를 할 수 있도록 지원하기도 한다. 
          • 당연히 해당 'Events'에 다양한 "AWS 이벤트 쏘스"를 지원한다. 강력하다.
        • AWS::Serverless:LayerVersion
          • 리소스로 'Lambda Layer'가 생성된다. (라이브러리 및 런타임 코드)
          • 이역시 Metadata 섹션의 특정값을 지정해서... SAM 으로 Layer 빌드 하도록 지시할수있다.
        • AWS::Serverless::SimpleTable
          • 리소스로 (pk 딸랑 하나있는) DynamoDB를 생성 합니다.
          • primary-key 하나만 있어도 되는 상황에 유용합니다.
          • 좀더 구체적으로 쓰고싶으면... CloudFormation의 AWS::DynamoDB::Table을 쓰면 됩니다.
        • AWS:Serverless::StateMachine
          • 리소스로 "Step Functions" 상태기계를 생성합니다. 
          • Lambda 함수와 다른 리소스가, 복합적이고 강력한 workflow 하도록 오케스트레이트 할 수 있습니다.
      • Resource attributes(속성)
        • SAM 혹은 CloudFomation 에 작성한 리소스들의 관계에 따른 동작을 제어 할 수 있다.
        •  DependsOn, DeletionPolicy, UpdateReplacePolicy, ...
      • Intrinsic functions
        • (빌트인) 내장함수를 통해서~ 런타임에 특정 properties 의 값을 대입 할 수 있다.
        • !Base64 valueToEncode = 해당값을 베이스64 인코딩.
        • !Cidr [ipblock, count, cidrBits ] = 사이터(클래스없는 도메인간 라우팅) 데이터.
        • condition, Fn::And , Fn::Equals , Fn::If, Fn::Not, Fn::or, ...
        • !FindInMap [MapName, TopLevelKey, SecondLevelKey] = 정의해둔 맵값 접근
        • !GetAtt logicalNameOfResource.attributeName = 특정 리소스의 특정 값 접근
        • !GetAZs region = 해당 리전의 가용영역을 나열해 줌.
        • !ImportValue sharedValueToImport = 다른 스택에서 보낸 값을 리턴함.
        • !Join [ ":", [a,b,c] ] = "a:b:c" 식으로 문자 합치기.
        • !Select [ "2", ["A", "B", "C"] ] = "C" 출력.
        • !Split [ "|", "A|B|C"] ] = 스플릿 하기
        • !Sub "www.${Domain}.com" = string 의 해당 값을 정의한 값으로 Replace
        • !Transform = 특정 매크로를 동작 시킬수 있다.
          • Name: 매크로 이름
          • Parameters:
            • : 벨류
        • !Ref logicalName = 특정 리소스 or 파라미터 값을 리턴.
      • ...
    • 2) SAM 작성하기
      • AWS 리소스 접근권한 : ...
      • EventBridge 스케줄링 : ... 
      • 'sam validate' 커맨드 : template.yaml에 사용할 컴포넌트를 선언 및 설정 뒤~ 유효한지? 확인.
      • 'Lambda Layer' 활용 : AWS::Serverless::Function의 Layers에 <LayerVersion ARN> 지정.
        • (local 테스트시, 해당 layer-package는 자동으로 다운로드... 특정 경로에 캐시되어 ... )
      • '기 Serverless Application' 을 Nested : "SAR의 arn" 혹은 "기 template.yaml" 을 활용.
      • API 접근제어 : AWS::Serverless::Api의 Auth에, 사용할 authorization 메커니즘을 셋팅하면 됨.
        • Lambda Token 혹은 Request : ...
        • Cognito User Pool : ...
        • IAM Permission : ...
        • API Key : ...
        • Resource Policy : ...
        • OAuth2.0 / JWT : ...
        • Custom : ...
      • App 오케스트레이션 : AWS::Serverless::StateMachine에 그...json을 지정하여, 람다 및 리소스를 운영 할 수 있삼.
      • 코드 서명 : serverless app 에 서명을 해서, 다른사람들에게 신뢰 받을 수 있도록 할 수 있다.
        • code-signing config 작성
        • sam package 및 deploy 시, --signing-profiles 옵션 사용
    • 3) SAM 빌드하기
      • Building applications
        • 앱은 코드 및 manifest파일 (requirements.txt) 등등의 디펜던시 를 빌드함.
        • 정의한 람다의 'PackageType' 특성값에따라 아래와 같이 빌드 결과물이 달라짐.
          • Zip = 결과물을 .zip 으로 압축
            • 예) sam build --use-container --build-image Func1=amazon/aws-sam-cli-build-image-python3.7
          • Image = 컨테이너 이미지로 빌드
            • SAM "Matadata" 및 "Properties" 를 필수명시 해야함.
            • 예)
            • Properties: 
              • PackageType: Image
              • ImageConfig
                • Command: ["app.lambda_handler"]
                • EntryPoint : ...
                • WorkingDirectory : ...
            • Metadata: 
              • DockerFile : 도커파일 이름
              • DockerContext : 도커파일 경로
              • DockerTag: 이미지 태그
              • DockerBuildArgs : 빌드 아규먼츠
        • container-env-var-file
          • sam build --container-env-var-file env.json 식으로 환경변수파일을 사용할수있음.
      • Building layers
        • ...
      • Building custom runtimes
        • "sam build" 커맨드를~ 커스텀하여, 람다함수 런타임 커스텀 환경 셋팅
          • 기본적인 requirements.txt 모듈설치는 원래 해주는거이고, 그 이외 추가적인 커스텀
          • 즉, "Properties: Runtime: python3.x" 에 더 추가적인 셋팅을 할 수 있다는것
          • (PackageType: Zip 에서 특정 환경이 필요할때 유용 할 듯!!!)
          • (PackageType: Image 에서는 어차피 알어서 커스텀 하게 쓰니...)
        • 일단, "Metadata: BuildMethod: makefile" 선언.
        • CodeUri 하위에 Makefile 작성.
        • Makefile에 "build-{function-logical-id}" 식으로 커맨드 작성.
        • 예) Makefile builder for Python3.7 (alternative to using the bundled builder)
          • ...
    • 4) SAM 테스트하기
      • sam local invoke : 로컬에서 직접호출 해보기...
      • sam local start-api : 로컬에서 api 띄워, http req 해보기...
      • sam local start-lambda : 로컬에서 lamda 띄워, boto3.client('lambda', ... ) 통합 테스트 해보기...
      • 디버깅 : https://docs.aws.amazon.com/ko_kr/toolkit-for-jetbrains/latest/userguide/invoke-lambda.html (파이참 )
      • ...
    • 5) SAM 배포하기
      • 기 CI/CD 파이프라인 작성
        • AWS CodePipeline : 'AWS CloudFormation 템플릿', 'buildspec.yml' 작성.
        • Bitbucket Pipeline : 'bitbucket-pipelines.yml' 작성.
        • Jenkins : 'Jenkinsfile' 작성.
        • GitLab : gitlab-ci.yml 작성.
        • GitHub Action : 호스트에 SAM-CLI 설치 -> 워크플루우 작업 작성.
      • 신 CI/CD 파이프라인 생성(sam pipeline)
        • [AWS IAM 및 S3(혹은 ECR) 및 Git Repo 준비 -> 파이프라인 구성 -> CI/CD 시스템 설정]
        • (안내 프롬프트 커스텀 지원 및 OpenID Connect 지원)
        • AWS CodePipeline : ...
        • Bitbucket, Jenkins, GitLab, GitHub Action : ...
      • Deploying SAM Gradually
        • https://docs.aws.amazon.com/ko_kr/serverless-application-model/latest/developerguide/automating-updates-to-serverless-apps.html
    • 6) 모니터링
      • AWS CloudWatch Application Insights 활성 : ...
      • sam log : ...
    • 7) 게시
      • SAR : ...
  • AWS Cloud Development Kit (CDK) : 별도 문서로 ㄱㄱㄱ

  • 튜토리얼
    • App 초기화
      • ex) sam init --runtime python3.7
        • (aws helloworld quick-template)
        • sam-app명/
          • events/
            • event.json # 해당 람다함수 http 호출하는 이벤트.
          • hello_world/
            • __init__.py
            • app.py # 람다 핸들러 로직. 기본코드.
            • requirements.txt # 파이썬 디펜던시 모듈 리스트. 'sam bulid' 시 사용됨.
          • template.yaml # 본 Serverless Application 의 리소스를 정의하는 SAM-템플릿.
          • tests/
            • unit/
              • __init__.py
              • test_handler.py 
      • 해당 template.yaml 이 생성됨. (해당 AWS 리소스와 관계가 기본적으로 정의됨)
      • 해당 언어로 작성된 기본코드가 생성됨. (해당 언어의 AWS Lambda 런타임 환경이 제공됨)
    • App 빌드
      • ex) sam build --use-container (template.yaml 파일경로에서 커맨드)
        • 해당 경로의 ".aws-sam/build" 에 빌드 결과물 생성됨.
        • --use-container 옵션을 사용하면,
        •   로컬에 특정 Docker-Image(aws-sam-cli-build-image-python3.7) 를 받아서, 해당 빌드환경으로 하는것 같음.
        • 결과적으로... 해당 app의 코드와 필요한 모든 디펜던시 등등, Artifact를 구성하여~ 패키징 및 배포 준비를 하는것 
    • App 로컬 개발&테스트
      • ex) sam local invoke
      • ex) sam local invoke "HelloWorldFunction" -e events/event.json
        • 로컬에서 해당 lambda_fuction을 한번 실행.
        • 로컬에 특정 Docker-Image(aws-sam-cli-emulation-image-python3.7) 를 받아서, 실행환경이 자동으로 구축됨.
      • ex) sam local start-api --region ap-northeast-2
        • 로컬endpoint으로 (해당 lambda_fuction과 맵핑된) API를 호출 할 수 있는 환경이 자동으로 구축됨.
        • Hot-Reloading 이 지원되어, 재시작 없이도~ lambda_fuction 코드를 수정 및 확인 가능.
        • "AWS 클라우드 리소스"와 로컬이 연동되어... (로컬에서) AWS 환경과 상호작용 개발 가능.
      • ex) sam local generate-eventsam local start-lambda
        • ...
    • App 배포
      • ex) sam deploy --guided --region ap-northeast-2
        • 배포 StackName : CloudFormation Stack Changeset 음...
        • Confirm Changeset : Y|N 및 ...
      • 'samconfig.toml' 파일로, 배포설정을 저장 할 수 있음.  
      • 내부적으로 CloudFormation기반으로 처리되면서, 'AWS 클라우드'에 리소스가 구축됨.
        • aws-sam-cli 스택 : S3 버킷 관련 리소스를 관리. (패키징된 빌드 Artifacts를 업로드)
        • 애플리케이션 스택 : 해당되는 API-GW 및 Lambda 및 IAM 등의 리소스 
      • 배포가 완료되면, "https://아이디.execute-api.ap-northeast-2.amazonaws.com/Prod/hello" 식으로~ End-Point가 나옴.

-끝-

'AWS' 카테고리의 다른 글

Amazon SageMaker Studio  (0) 2020.07.16
AWS Serverless Application Repository  (0) 2020.06.29
Amazon Simple Queue Service  (0) 2020.05.16
Amazon CloudWatch  (0) 2020.04.25
Amazon EC2  (1) 2020.03.14

+ Recent posts