AWS 서버 없는 응용 프로그램 모델: 첫 번째 AWS SAM 응용 프로그램 설명서 작성

오늘 우리는 서버 없는 응용 프로그램 모델 (SAM) 을 사용하여 서버 없는 응용 프로그램을 작성하는 방법을 보게 될 것이다.
우선 서버 없는 응용 프로그램 모델이 무엇인지 알아보자.

서버 없는 응용 프로그램 모델은 무엇입니까?
AWS에 Lambda 함수와 같은 자원을 만들려면 어떻게 하시겠습니까?AWS 콘솔에 로그인하고 수동으로 Lambda 서비스로 이동하여 함수를 만듭니다.현재 이 함수를 10개 만들려면 같은 과정을 10번 반복해야 한다.이것은 잘못되기 쉬울 뿐만 아니라 시간도 많이 걸린다.SAM을 사용하면 한 번만 작성하면 언제든지 배포할 수 있습니다.이것은 구름의 형성과 유사하다.너는 샘이 구름이 형성한 초집이라고 말할 수 있다.
AWS 서버 없는 응용 프로그램 모델(SAM)은 서버 없는 응용 프로그램을 구축하는 데 사용되는 소스 프레임워크이다.함수, API, 데이터베이스 및 이벤트 소스 매핑을 나타내는 메모 구문을 제공합니다.몇 줄의 코드만 있으면 필요한 프로그램을 정의하고 YAML을 사용하여 모델링할 수 있습니다.배포하는 동안 SAM은 SAM 구문을 AWS CloudFormation 구문으로 변환하여 서버 없는 어플리케이션을 보다 빠르게 구축할 수 있도록 합니다.
환경 변수와 매개변수를 사용하여 모든 리소스의 이름을 동적으로 지정하고 DEV, TEST, PROD와 같은 리소스 그룹을 사용하여 다른 환경을 만들 수 있습니다.

샘과 시작
SAM을 사용하려면 SAM-CLI를 설치해야 합니다.SAM CLI는 SAM 템플릿으로 정의된 애플리케이션을 로컬에서 구축, 테스트 및 디버깅할 수 있는 Lambda와 유사한 실행 환경을 제공합니다.SAM CLI를 사용하여 AWS에 애플리케이션을 배포할 수도 있습니다.
설명서 here에 따라 SAM CLI를 설치할 수 있습니다.
계속하기 전에 사용자가 컴퓨터에서 자원을 만들고 설정할 수 있는 모든 권한을 가지고 있는지 확인하십시오.AWS 계정을 구성하려면 AWS CLI를 설치하고 aws configure 명령을 실행하여 자격 증명을 설정합니다.모든 권한을 가진 관리자 사용자를 사용합니다.
현재 우리는 예시 프로그램을 다운로드하고 그 내용을 검사할 준비를 하고 있다.터미널에서 다음 명령을 실행합니다
sam init
그것은 너에게 몇 가지 선택을 요구할 것이다.주의: 실행할 때 설치되어 있어야 합니다.
ubuntu@ubuntu-VirtualBox:~/MyWorkspace/BlogPosts/SAM$ sam init
Which template source would you like to use?
    1 - AWS Quick Start Templates
    2 - Custom Template Location
Choice: 1

Which runtime would you like to use?
    1 - nodejs12.x
    2 - python3.8
    3 - ruby2.7
    4 - go1.x
    5 - java11
    6 - dotnetcore3.1
    7 - nodejs10.x
    8 - python3.7
    9 - python3.6
    10 - python2.7
    11 - ruby2.5
    12 - java8.al2
    13 - java8
    14 - dotnetcore2.1
Runtime: 2

Project name [sam-app]: SAM application

Cloning app templates from https://github.com/awslabs/aws-sam-cli-app-templates.git

AWS quick start application templates:
    1 - Hello World Example
    2 - EventBridge Hello World
    3 - EventBridge App from scratch (100+ Event Schemas)
    4 - Step Functions Sample App (Stock Trader)
    5 - Elastic File System Sample App
Template selection: 1

-----------------------
Generating application:
-----------------------
Name: SAM application
Runtime: python3.8
Dependency Manager: pip
Application Template: hello-world
Output Directory: .

Next steps can be found in the README file at ./SAM application/README.md

파일 시스템으로 이동하면 다음과 같은 파일 구조가 생성됩니다.
SAM application/
   ├── 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
템플릿을 엽니다.yml, 내용을 분석해 봅시다.
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  SAM application

  Sample SAM Template for SAM application

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 3

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:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /hello
            Method: get

Outputs:
  # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function
  # Find out more about other implicit resources you can reference within SAM
  # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api
  HelloWorldApi:
    Description: "API Gateway endpoint URL for Prod stage for Hello World function"
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
  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
AWSTemplateFormatVersion - 각 템플릿의 첫 번째 행은 항상 변경되지 않습니다.yml.Transform - AWS CloudFormation이 템플릿을 처리하는 데 사용하는 하나 이상의 매크로를 지정합니다.이것은 필수 과목이다.Description은 자명하다.Globals - 전체 템플릿 공유의 속성을 정의하는 SAM만의 고유한 기능입니다.이 경우 timeout은 모든 기능에 적용됩니다.구상체는 구름의 형성 속에 존재하지 않는다.Resources - 이 항목의 모든 AWS 리소스를 정의합니다.이것도 강제적인 부분이다.
여기서 우리는 HelloWorldFunction이라는 논리 함수를 정의했는데, 그 유형은 AWS::Serverless::Function이고, 실행할 때python 3.8CodeUri은 파일 시스템에 있는 프로세서가 있는 폴더를 가리킨다.Handler은 파일 이름 및 방법입니다.Events은 API 게이트웨이에 GET, /hello의 API를 생성합니다.Outputs - 스택을 만든 후 반환되고 사용할 수 있는 값을 설명합니다.예를 들어, 템플릿에서 HelloWorldApi 출력은 함수로 생성된 API Url을 제공합니다.또한 Lambda 및 IAM 역할 ARN을 출력으로 설정합니다.
또한 !SubGetAtt 함수는 출력에서 !Sub은 변수로 값을 바꾸는 데 사용됩니다.여기서 ${AWS::Region}과 ${ServerlessRestApi}를 바꿉니다.GetAtt 함수는 템플릿에 있는 자원의 속성 값을 되돌려줍니다.여기서 우리는 HelloWorld 함수를 이해해야 한다.
지금 프로그램을 검사합니다.py 파일.그것은 아주 간단합니다. "Hello World"를 응답으로 되돌려줍니다.
import json

# import requests


def lambda_handler(event, context):
    """Sample pure Lambda function

    Parameters
    ----------
    event: dict, required
        API Gateway Lambda Proxy Input Format

        Event doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format

    context: object, required
        Lambda Context runtime methods and attributes

        Context doc: https://docs.aws.amazon.com/lambda/latest/dg/python-context-object.html

    Returns
    ------
    API Gateway Lambda Proxy Output Format: dict

        Return doc: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html
    """

    # try:
    #     ip = requests.get("http://checkip.amazonaws.com/")
    # except requests.RequestException as e:
    #     # Send some context about this error to Lambda Logs
    #     print(e)

    #     raise e

    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": "hello world",
            # "location": ip.text.replace("\n", "")
        }),
    }
터미널로 돌아가서 cdtemplate.yml이 있는 디렉터리에 넣고 명령 실행: sam build
ubuntu@ubuntu-VirtualBox:~/MyWorkspace/BlogPosts/SAM/SAM application$ sam build
Building function 'HelloWorldFunction'
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
=========================
[*] Invoke Function: sam local invoke
[*] Deploy: sam deploy --guided

sam build 명령은 프로그램이 가지고 있는 모든 의존항을 생성하고 프로그램 소스 코드를 다음 폴더로 복사합니다.aws sam/build이 압축되어 Lambda에 업로드됩니다.프로젝트 디렉토리에서 .aws-sam 폴더의 컨텐트를 확인합니다.그것은 아래와 유사할 것이다.HelloWorldFunction 폴더에는 여러 파일 및 응용 프로그램이 있습니다.py
.aws_sam/
   └── build/
       ├── HelloWorldFunction/
       └── template.yaml
지금은 sam deploy -g을 운행할 때다.프로그램 이름, 창고를 만들 지역 이름 등 설정 정보를 묻습니다. 설치하기 전에 확인을 요청하면 확인을 기다립니다.
buntu@ubuntu-VirtualBox:~/MyWorkspace/BlogPosts/SAM/SAM application$ sam deploy -g

Configuring SAM deploy
======================

    Looking for samconfig.toml :  Not found

    Setting default arguments for 'sam deploy'
    =========================================
    Stack Name [sam-app]: my-first-sam-app
    AWS Region [us-east-1]: us-east-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
    HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y
    Save arguments to samconfig.toml [Y/n]: y

    Looking for resources needed for deployment: Found!

        Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-1xyg1t2j2ws5k
        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 my-first-sam-app/9601808ead19b558184dcec8285866a3  538937 / 538937.0  (100.00%)

    Deploying with following values
    ===============================
    Stack name                 : my-first-sam-app
    Region                     : us-east-1
    Confirm changeset          : True
    Deployment s3 bucket       : aws-sam-cli-managed-default-samclisourcebucket-1xyg1t2j2ws5k
    Capabilities               : ["CAPABILITY_IAM"]
    Parameter overrides        : {}

Initiating deployment
=====================
HelloWorldFunction may not have authorization defined.
Uploading to my-first-sam-app/362accae02d25f5921348967d73b9d29.template  1115 / 1115.0  (100.00%)

Waiting for changeset to be created..
CloudFormation stack changeset
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Operation                                                          LogicalResourceId                                                  ResourceType                                                     
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ Add                                                              HelloWorldFunctionHelloWorldPermissionProd                         AWS::Lambda::Permission                                          
+ Add                                                              HelloWorldFunctionRole                                             AWS::IAM::Role                                                   
+ Add                                                              HelloWorldFunction                                                 AWS::Lambda::Function                                            
+ Add                                                              ServerlessRestApiDeployment47fc2d5f9d                              AWS::ApiGateway::Deployment                                      
+ Add                                                              ServerlessRestApiProdStage                                         AWS::ApiGateway::Stage                                           
+ Add                                                              ServerlessRestApi                                                  AWS::ApiGateway::RestApi                                         
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Changeset created successfully. arn:aws:cloudformation:us-east-1:<account #>:changeSet/samcli-deploy1599948737/03d65ab9-a943-494d-8db6-abf6aad17537


Previewing CloudFormation changeset before deployment
======================================================
Deploy this changeset? [y/N]: 

확인되면 창고를 만들기 시작합니다.다음은 스택 생성이 완료된 출력입니다.
2020-09-12 17:13:45 - Waiting for stack create/update to complete

CloudFormation events from changeset
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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                           HelloWorldFunctionHelloWorldPermissionProd        Resource creation Initiated                     
CREATE_IN_PROGRESS                                AWS::ApiGateway::Deployment                       ServerlessRestApiDeployment47fc2d5f9d             -                                               
CREATE_IN_PROGRESS                                AWS::Lambda::Permission                           HelloWorldFunctionHelloWorldPermissionProd        -                                               
CREATE_COMPLETE                                   AWS::ApiGateway::Deployment                       ServerlessRestApiDeployment47fc2d5f9d             -                                               
CREATE_IN_PROGRESS                                AWS::ApiGateway::Deployment                       ServerlessRestApiDeployment47fc2d5f9d             Resource creation Initiated                     
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                           HelloWorldFunctionHelloWorldPermissionProd        -                                               
CREATE_COMPLETE                                   AWS::CloudFormation::Stack                        my-first-sam-app                                  -                                               
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

CloudFormation outputs from deployed stack
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Outputs                                                                                                                                                                                                
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Key                 HelloWorldFunctionIamRole                                                                                                                                                          
Description         Implicit IAM Role created for Hello World function                                                                                                                                 
Value               arn:aws:iam::<account #>:role/my-first-sam-app-HelloWorldFunctionRole-27OIM6WD99F0                                                                                                

Key                 HelloWorldApi                                                                                                                                                                      
Description         API Gateway endpoint URL for Prod stage for Hello World function                                                                                                                   
Value               https://3kuuurt63m.execute-api.us-east-1.amazonaws.com/Prod/hello/                                                                                                                 

Key                 HelloWorldFunction                                                                                                                                                                 
Description         Hello World Lambda Function ARN                                                                                                                                                    
Value               arn:aws:lambda:us-east-1:<account #>:function:my-first-sam-app-HelloWorldFunction-1U5YD9NICU5LP                                                                                   
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Successfully created/updated stack - my-first-sam-app in us-east-1

출력에서 보듯이 HelloWorldApi URL이 생성되어 브라우저에서 URL을 클릭하고 API가 제대로 작동하는지 확인할 수 있습니다.AWS 콘솔의 Cloud Formation 출력 부분에서도 동일한 정보를 볼 수 있습니다.
잘했어!첫 번째 SAM 애플리케이션을 성공적으로 완료했습니다.

너는 샘에게 무엇을 할 수 있니?
이것은 아직 끝나지 않았습니다. 배치하기 전에 로컬에서 이 기능을 테스트할 수 있습니다.AWS SAM CLI는 Lambda 실행 환경을 시뮬레이션하는 Docker 컨테이너를 사용하여 응용 프로그램을 실행하는 sam local 명령을 제공합니다.
나는 linux 기계에 있기 때문에 명령을 실행할 것이다: sudo /home/linuxbrew/.linuxbrew/bin/sam local start-api
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

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. You only need to restart SAM CLI if you update your AWS SAM template
2020-09-12 22:31:06  * Running on http://127.0.0.1:3000/ (Press CTRL+C to quit)
브라우저에서 URL (http://127.0.0.1:3000/hello) 을 눌렀을 때, 이전과 같은 응답 "Hello World"를 볼 수 있고, 터미널에 비슷한 내용을 표시할 수 있습니다
Invoking app.lambda_handler (python3.8)
Failed to download a new amazon/aws-sam-cli-emulation-image-python3.8:rapid-1.1.0 image. Invoking with the already downloaded image.
Mounting /home/ubuntu/MyWorkspace/BlogPosts/SAM/SAM application/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated inside runtime container
START RequestId: f4945824-0a1a-1742-2f46-4d0bc2bbe515 Version: $LATEST
END RequestId: f4945824-0a1a-1742-2f46-4d0bc2bbe515
REPORT RequestId: f4945824-0a1a-1742-2f46-4d0bc2bbe515  Init Duration: 216.83 ms    Duration: 2.88 ms   Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 24 MB  
No Content-Type given. Defaulting to 'application/json'.
2020-09-12 22:38:28 127.0.0.1 - - [12/Sep/2020 22:38:28] "GET /hello HTTP/1.1" 200 -


이제 어떡하지?
이것은 매우 기본적인 SAM 응용 프로그램이지만, 나는 당신이 그것의 요점을 이해하기를 바랍니다.연습으로 클라우드 Front, Route53, DynamoDB, ACM 등 더 많은 자원을 추가하고 YAML에서 모델링하는 방법을 이해할 수 있습니다.더 복잡한 SAM 템플릿을 보려면 herehere을 참조하십시오.
만약 당신이 나의 문장을 좋아한다면, 언제든지 나의 업데이트에 관심을 가져 주십시오.

좋은 웹페이지 즐겨찾기