AWS 서버 없는 응용 프로그램 모델: 첫 번째 AWS SAM 응용 프로그램 설명서 작성
27699 단어 serverlessawslambdacloud
우선 서버 없는 응용 프로그램 모델이 무엇인지 알아보자.
서버 없는 응용 프로그램 모델은 무엇입니까?
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을 출력으로 설정합니다.또한
!Sub
과 GetAtt
함수는 출력에서 !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", "")
}),
}
터미널로 돌아가서 cd
을 template.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 템플릿을 보려면 here 및 here을 참조하십시오.
만약 당신이 나의 문장을 좋아한다면, 언제든지 나의 업데이트에 관심을 가져 주십시오.
Reference
이 문제에 관하여(AWS 서버 없는 응용 프로그램 모델: 첫 번째 AWS SAM 응용 프로그램 설명서 작성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/rajanpanchal/aws-serverless-application-model-guide-to-writing-your-first-aws-sam-application-2ol7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)