#AWS Certified Developer Associate
363. SAM - CloudFormation 디자이너 및 애플리케이션 리포지토리
SAM 을 이용할 때의 장점
- 실제 cloudformation 탬플릿 또한 간단하지만 서버리스 애플리케이션을 IaC 로 관리할 때 더욱 장점이 발휘됨
- 여러 예제 템플릿을 제공해서 쉽게 사용할 수 있음
364. SAM 정책 템플릿
SAM 정책 템플릿 또는 서버리스 모델 정책 템플릿
정책 템플릿 : 람다 함수에 권한을 설정할 수 있는 템플릿의 목록
- 권한을 다시 그룹화하는 템플릿을 기반으로 람다 함수를 통해 할 수 있는 작업을 알려줌
full list available :
정책 예시 :
S3ReadPolicy : s3 내의 객체에 대하여 읽기 권한만 부여하는 정책 템플릿
SQSPollerPolicy : 람다 함수가 SQS 대기열을 폴링할 수 있게 함
DynamoDBCrudPolicy : CRUD 정책 (create, read, update, delete)
365. CodeDeploy 가 있는 SAM
CodeDeploy 와 SAM 프레임워크의 통합
SAM 이 CodeDeploy 를 이용해 람다 함수를 업데이트
cloudwatch alarms 을 활용해 자동 롤백
lambda function post-traffic hook 로 run tests 시 정상이면 v1 을 삭제해서 v2 로 업데이트함
실습
sam-codedeploy 라는 디렉토리를 새로 만들고 새로운 SAM 애플리케이션을 실행한다고 함
새로 만든 디렉토리로 이동한 후
D:\DEV\General\aws-sam-Training\sam-codedeploy>sam init --runtime python3.8
Which template source would you like to use?
1 - AWS Quick Start Templates
2 - Custom Template Location
Choice: 1
Choose an AWS Quick Start application template
1 - Hello World Example
2 - Hello World Example With Powertools
3 - Infrastructure event management
4 - Multi-step workflow
5 - Lambda EFS example
6 - Serverless Connector Hello World Example
7 - Multi-step workflow with Connectors
Template: 1
Based on your selections, the only Package type available is Zip.
We will proceed to selecting the Package type as Zip.
Based on your selections, the only dependency manager available is pip.
We will proceed copying the template using pip.
Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]: n
Would you like to enable monitoring using CloudWatch Application Insights?
For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]: n
Project name [sam-app]:
Cloning from https://github.com/aws/aws-sam-cli-app-templates (process may take a moment)
-----------------------
Generating application:
-----------------------
Name: sam-app
Runtime: python3.8
Architectures: x86_64
Dependency Manager: pip
Application Template: hello-world
Output Directory: .
Configuration file: sam-app\samconfig.toml
Next steps can be found in the README file at sam-app\README.md
Commands you can use next
=========================
[*] Create pipeline: cd sam-app && sam pipeline init --bootstrap
[*] Validate SAM template: cd sam-app && sam validate
[*] Test Function in the Cloud: cd sam-app && sam sync --stack-name {stack-name} --watch
D:\DEV\General\aws-sam-Training\sam-codedeploy>
D:\DEV\General\aws-sam-Training\sam-codedeploy>
위처럼 sam 예제를 실행해주면
예제 파일이 자동 생성 된다
이후 sam-app 디렉토리로 이동 후 빌드해준다
D:\DEV\General\aws-sam-Training\sam-codedeploy>cd sam-app
D:\DEV\General\aws-sam-Training\sam-codedeploy\sam-app>sam build
Starting Build use cache
Manifest file is changed (new hash: 3298f13049d19cffaa37ca931dd4d421) or dependency folder (.aws-sam\deps\271287dc-cfaf-4de7-917e-c2851041d8ce) is missing for (HelloWorldFunction), downloading dependencies and copying/building source
Building codeuri: D:\DEV\General\aws-sam-Training\sam-codedeploy\sam-app\hello_world runtime: python3.8 metadata: {} architecture: x86_64 functions: HelloWorldFunction
Running PythonPipBuilder:CleanUp
Running PythonPipBuilder:ResolveDependencies
Running PythonPipBuilder:CopySource
Running PythonPipBuilder:CopySource
Build Succeeded
Built Artifacts : .aws-sam\build
Built Template : .aws-sam\build\template.yaml
Commands you can use next
=========================
[*] Validate SAM template: sam validate
[*] Invoke Function: sam local invoke
[*] Test Function in the Cloud: sam sync --stack-name {{stack-name}} --watch
[*] Deploy: sam deploy --guided
D:\DEV\General\aws-sam-Training\sam-codedeploy\sam-app>
helloworld 예제는 그냥 단순히 hello world 를 반환해주는 단순한 애플리케이션이다
위 예제 파일의 template.yaml 파일에 SAM 프레임워크에 CodeDeploy 가 통합되기 위해 코드를 추가한다고 함
AutoPublishAlias: live
DeploymentPreference:
Type: Canary10Percent10Minutes
Resources 아래의 Events 항목과 동일선상(들여쓰기)에 해당 코드를 넣어준다
배포 설정에 카나리 유형을 선택했는데 이는 별칭에 배포가 이루어질 때마다 두가지 버전이 생긴다는 뜻
그 중 하나는 10분마다 10%의 트래픽을 사용하며 아무 이상이 없을 시 다시 10분 후 100%로 사용한다는 뜻
이렇게 수정한 후 다시 sam build 를 해주고
sam deploy --guided 로 배포해준다고 함
가이드를 따라서 대충 선택해주고 배포해주면
위처럼 람다함수와 iam 역할, codedeploy 도 생성 예정인 것을 확인할 수 있다
조금 더 기다린 후에
cloudformation 스택에서 확인해보면
리소스들이 생성된것을 확인할 수 있다
람다함수 콘솔로 가서 애플리케이션을 확인해보면
애플리케이션이 생성된것을 확인할 수 있다
람다함수로 들어가서 버전을 확인해보면
alias live 가 버전 1임을 확인할 수 있다
이제 code deploy 를 사용하기 위해 원문 코드를 수정한다고 함
작업디렉토리로 가서 app.py 의 리턴 문자열에 v2 를 입력하고 업데이트 한다고 함
다시 sam build 로 빌드해주고
sam deploy --guided 로 배포
D:\DEV\General\aws-sam-Training\sam-codedeploy\sam-app>sam deploy --guided --profile aws-student
Configuring SAM deploy
======================
Looking for config file [samconfig.toml] : Found
Reading default arguments : Success
Setting default arguments for 'sam deploy'
=========================================
Stack Name [sam-app]:
AWS Region [ap-northeast-2]: ap-northeast-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
#Preserves the state of previously provisioned resources when an operation fails
Disable rollback [y/N]: y
HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y
Save arguments to configuration file [Y/n]: y
SAM configuration file [samconfig.toml]:
SAM configuration environment [default]:
체인지셋을 보면
별칭과 람다함수가 수정되고 새로운 버전이 추가된다고 함
그리고 람다 버전 하나가 삭제될것이라고 한다
확인해주면
이후 배포가 시작되고 람다 함수로 가서 확인해보면
버전이 새로 생겼고 별칭으로 가보면
카나리 배포가 실행중임을 확인할 수 있다
codedeploy 콘솔로 가보면
람다 함수에 대해 블루/그린 배포가 진행중임을 확인할 수 있다
들어가보면
검증 대상이 없었으므로 배포전 확인이 성공이라고 나오고
가중치에 의한 트래픽 shift 가 나온다
배포 후 확인(사후 확인)을 진행하게 되면 100%트래픽이 v2 로 향햐게 될 것이다
이후 이전 버전은 삭제되고 새로 업데이트한 버전만 람다 함수에 남게 된다
10분이 지나야 확인할 수 있다고 함
10분이 지나 카나리 배포가 완료된 모습
366. SAM 섹션 요약
SAM 은 CloudFormation 상에 구축되었음
- Transform 헤더 : SAM 템플릿이라는 점을 표시해줌
- Resources 섹션
sam build : 종속성을 불러오고 로컬 배포 아티펙트를 생성
sam package : amazon s3 에 패키징, 업로드를 수행하고 cloudformation 템플릿을 생성
sam deploy : cloudformation 에 배포를 수행
SAM Policy template : SAM 함수에 대해 간단히 IAM 정책을 정의할 수 있음
SAM + CodeDeploy 통합 : 람다함수와 버전을 람다 별칭에 배포할 수 있음
367. 서버리스 애플리케이션 리포지토리 (SAR - Serverless Application Repository)
SAR :
- SAM, 즉 서버리스 애플리케이션 모델을 이용해서 생성 및 패키징 됨
- 조직에서 재사용할 수 있는 애플리케이션을 구축하고 게시하는데 사용됨
- SAM 을 사용해서 애플리케이션을 구축한 후 이를 공개적으로 공유하거나 특정 AWS 계정과 공유하여 재사용할 수 있음
람다 함수를 작성하고 버전화해서 리포지토리로부터 다른 계정으로 게시할 수 있는 하나의 방법
중복 작업을 피하고 바로 게시(publishing) 단계로 넘어갈 수 있음
설정과 환경 변수를 사용해서 배포 시에 SAR 로 부터 가져오는 애플리케이션을 사용자 지정할 수도 있음
368. 서버리스 애플리케이션 리포지토리 실습
서버리스 애플리케이션을 신속히 공유 및 배포할 수 있는 방법
public application
검증된 작성자가 SAR 에 게시하는 것
여기서 템플릿을 받아서 바로 배포할 수 있다
private application
SAR 에 사설 앱을 배포한다고 한다
cloudshell 로 들어가서
0-steps.sh
# Initialize the Application
sam init --runtime python3.8
# Choose 1
# Which template source would you like to use?
# 1 - AWS Quick Start Templates
# 2 - Custom Template Location
# Choice:
# Choose 1
# What package type would you like to use?
# 1 - Zip (artifact is a zip uploaded to S3)
# 2 - Image (artifact is an image uploaded to an ECR image repository)
# Package type:
# Project name [sam-app]: [Enter]
# Choose 1
# 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)
# Template selection:
# 2. update the code and template.yaml
# 3. deploy
# Create an S3 bucket
aws s3 mb s3://bucketname
# Edit S3 bucket policy, allowing AWS SAR read from this bucket
aws s3api put-bucket-policy --bucket bucketname --policy file://policy.json
# 4. package the application
# This command does the following:
# - Zips the contents of hello_world/ dir and uploads it to our bucket
# - Outputs a new template file packaged.yaml, same as template.yaml but has a difference CodeUri (reference to packaged artifacts on S3)
sam package --template-file template.yaml --output-template-file packaged.yaml --s3-bucket <bucketname>
# 5. publish the application
sam publish --template packaged.yaml --region us-east-1
# Created new application with the following metadata:
# {
# "Name": "my-app",
# "Description": "Hello World",
# "Author": "Stephane",
# "SemanticVersion": "0.0.1"
# }
# 6. deploy in AWS console
# 7. clean up
# - Delete the Deployed Application
# - Open the [AWS CloudFormation console](https://console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks?filteringStatus=active&filteringText=&viewNested=true&hideStacks=false)
# - Select and delete the stack
# - Delete the Published Application
# - Open the [AWS Serverless Application Repository Published Applications](https://console.aws.amazon.com/serverlessrepo/home?region=us-east-1#/published-applications)
# - Select and delete the application
# First empty the S3 bucket
aws s3 rm s3://bucketname --recursive
# Delete the bucket
aws s3 rb s3://bucketname
위 sh 를 따라 진행한다고 함
먼저 sam init 으로 예제 python 앱을 다운받는다
이름은 따로 바꾸지 않았다
ls 로 확인해보면
[cloudshell-user@ip-10-6-62-95 ~]$ ls
lambda response.json sam-app
[cloudshell-user@ip-10-6-62-95 ~]$
[cloudshell-user@ip-10-6-62-95 ~]$ cd sam-app/
[cloudshell-user@ip-10-6-62-95 sam-app]$ ls
events hello_world __init__.py README.md template.yaml tests
sam-app 이 확인된다
template.yaml 을 수정하기위해 편집기를 아무거나 하나 설치해주고
아래와 같이 수정해준다
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
sam-app
Sample SAM Template for sam-app
# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
Function:
Timeout: 3
Metadata:
AWS::ServerlessRepo::Application:
Name: my-app-yeonwoo
Description: Hello World
Author: Yeonwoo
SemanticVersion: 0.0.1
Parameters:
CustomName:
Type: String
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
Properties:
Environment:
Variables:
CUSTOM_NAME: !Ref CustomName
Architectures:
- x86_64
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
template.yaml 파일을 수정했으니 이제 배포할 차례이다
위의 sh 파일의 step 3 를 따라서 버킷을 만들어주고
버킷 정책을 위해 새로 policy.json 파일을 만들어 줬다
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "serverlessrepo.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::<your-bucket-name>/*",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "123456789012"
}
}
}
]
}
이 버킷 정책으로 SAR 이 위에서 만든 S3 버킷에서 객체를 가지고 올 수 있도록 허용할 수 있다
api 호출을 통해 버킷 정책을 업데이트 해준다
[cloudshell-user@ip-10-6-62-95 sam-app]$ aws s3 mb s3://yeonwoo-sar-demo-2023
make_bucket: yeonwoo-sar-demo-2023
[cloudshell-user@ip-10-6-62-95 sam-app]$
[cloudshell-user@ip-10-6-62-95 sam-app]$ nano policy.json
[cloudshell-user@ip-10-6-62-95 sam-app]$
[cloudshell-user@ip-10-6-62-95 sam-app]$ rm policy.json
[cloudshell-user@ip-10-6-62-95 sam-app]$ nano policy.json
[cloudshell-user@ip-10-6-62-95 sam-app]$
[cloudshell-user@ip-10-6-62-95 sam-app]$
[cloudshell-user@ip-10-6-62-95 sam-app]$ aws s3api put-bucket-policy --bucket yeonwoo-sar-demo-2023 --policy file://policy.json
[cloudshell-user@ip-10-6-62-95 sam-app]$
이제 step 4 패키징을 해준다
sam package 명령어를 사용해 패키징 후 publish 명령으로 퍼블리싱 한다
[cloudshell-user@ip-10-6-62-95 sam-app]$ sam package --template-file template.yaml --output-template-file packaged.yaml --s3-bucket yeonwoo-sar-demo-2023
Uploading to c6ce8fa8b5a97dd022ecd006536eb5a4 847 / 847 (100.00%)
Successfully packaged artifacts and wrote output template to file packaged.yaml.
Execute the following command to deploy the packaged template
sam deploy --template-file /home/cloudshell-user/sam-app/packaged.yaml --stack-name <YOUR STACK NAME>
[cloudshell-user@ip-10-6-62-95 sam-app]$
[cloudshell-user@ip-10-6-62-95 sam-app]$ sam publish --template packaged.yaml --region ap-northeast-1
Publish Succeeded
Created new application with the following metadata:
{
"Name": "my-app-yeonwoo",
"Description": "Hello World",
"Author": "Yeonwoo",
"SemanticVersion": "0.0.1"
}
Click the link below to view your application in AWS console:
https://console.aws.amazon.com/serverlessrepo/home?region=ap-northeast-1#/published-applications/arn:aws:serverlessrepo:ap-northeast-1:662307199274:applications~my-app-yeonwoo
[cloudshell-user@ip-10-6-62-95 sam-app]$
그러면 SAR 의 사용 가능한 프라이빗 애플리케이션 목록에서 확인할 수 있다
환경변수도 넣고 배포를 누르면 바로 배포가 된다
실습이 끝나고 cloudformation 으로 이동해서 스택을 모두 삭제해주고 sar 앱도 모두 삭제해줬다
'AWS > AWS Certified Developer Associate' 카테고리의 다른 글
[Udemy][day-59,60] Section26 : Cognito (0) | 2023.03.02 |
---|---|
[Udemy][day-59] Section25 : 클라우드 개발 키트 (Cloud Development Kit, CDK) (0) | 2023.03.02 |
[Udemy][day-57,58] Section24 : AWS SAM - 1 (0) | 2023.02.26 |
[Udemy][day-56,57] Section23 : AWS 서버리스 : API Gateway - 3 (0) | 2023.02.23 |
[Udemy][day-55] Section23 : AWS 서버리스 : API Gateway - 2 (0) | 2023.02.21 |