AWS SAM 사용(nodejs Type Script Edition)

개요


AWS를 가져오기 위한 서버 유틸리티가 없는 SAMAWS Serverless Application Model을 사용합니다.
정식 프로그램 등 실행 시간 환경은 파이톤이지만, 노드입니다.js의 Type Script(공용 미리 보기) 항목을 만듭니다.

AWS SAM 설치


AWS SAM은 공식 프로그램을 참조하여 설치하십시오.
AWS의 CLI를 사용하려면 IAM에서 필요한 설정이 필요합니다.또한 로컬 환경에서 작업을 확인할 때 Docker 설치를 선택할 수 있습니다.
AWS CLI 및 Docker를 이미 사용한 경우 SAM만 설치하면 됩니다.
기본적으로 AWS 공식 절차에 따라 조작하는 형식에는 문제가 없다.
Linux 버전 설치 단계(공식)
Windows Edition 설치 단계(공식)
MacOS 버전 설치 단계(공식)

AWS CLI에 대한 인증 정보 설정


AWS CLI에 대한 인증 정보가 설정되지 않은 경우 를 설정합니다.
AWS CLI 인증 정보 설정 단계(공식)
AWS CLI에 대한 인증 정보가 설정되어 있지 않으면 sam build 장애가 발생합니다.

SAM 프로젝트 제작


SAM 프로젝트를 제작합니다.이번에는 메인 카탈로그 바로 아래에서 제작한다.sam init에서 항목 이름을 묻습니다. 이것은 폴더 이름이고 홈 디렉터리에서 실행됩니다.
shell
cd ~
sam init --runtime nodejs14.x
이번엔 --runtime nodejs14.x 노드.js의 14가지 옵션을 선택했습니다.
사용할 수 있는 런타임 옵션은 다음과 같습니다.
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-init.html
대화로 질문을 받기 때문에 순서대로 대답한다.
shell
Which template source would you like to use?
1 - AWS Quick Start Templates
2 - Custom Template Location
이번 선택1 - AWS Quick Start Templates.
shell
Choose an AWS Quick Start application template
	1 - Hello World Example
	2 - Multi-step workflow
	3 - Standalone function
	4 - Scheduled task
	5 - Data processing
	6 - Serverless API
Quick Start application template에 나오는 내용은 운행 시간에 따라 달라진다.
이번 선택1 - Hello World Example.
shell
Select your starter template
	1 - Hello World Example
	2 - Hello World Example TypeScript
Node.js를 선택하면 Type Script를 사용하여 템플릿을 만들 것인지 묻는 메시지가 나타납니다.
이번에는 선택2 - Hello World Example TypeScript을 해보자.
shell
Project name [sam-app]:
프로젝트 이름을 설정합니다.이번에는 기본sam-app로 제작되었습니다.
프로젝트 폴더는 다음과 같이 확장됩니다.
.
|-- .gitignore
|-- README.md
|-- events
|   `-- event.json
|-- hello-world
|   |-- .eslintignore
|   |-- .eslintrc.js
|   |-- .npmignore
|   |-- .prettierrc.js
|   |-- app.ts  : Lambda handlerのロジックが含まれます。
|   |-- jest.config.ts
|   |-- package.json  :アプリケーションの依存ライブラリが定義されています。sam buildで使用されます。
|   |-- tests
|   |   `-- unit
|   |       `-- test-handler.test.ts
|   `-- tsconfig.json
`-- template.yaml  : AWSリソースに関する定義が含まれます。
테스트 코드의 설정 등 디렉터리 구성은 운행 시간에 따라 다르다.

구축 실행


다음 명령을 사용하여 구문을 실행합니다.
shell
sam build
공개 미리보기가 진행 중이기 때문에 다음과 같은 질문을 받을 수 있다.
shell
You can also enable this beta feature with 'sam build --beta-features'. [y/N]:
y를 선택하고 구축을 계속합니다.
구축을 실행하면 파일이 다음 경로에서 생성됩니다.
.
|-- .aws-sam
|   |-- build
|   |   |-- HelloWorldFunction
|   |   |   |-- app.js
|   |   |   `-- app.js.map
|   |   `-- template.yaml
|   `-- build.toml

로컬 환경에서의 개발 환경 준비


함수가 설정된 디렉터리에 따라 의존 모듈을 정의한 파일을 생성했다(예: hello-world/package.json. 그러면 의존 프로그램 라이브러리에 존재하지 않고 IDE에 참고 오류가 있기 때문에 함수의 디렉터리에 실행한다npm install종속 모듈을 설치합니다.
shell
cd hello-world
npm install

로컬 환경에서의 동작 확인(함수)


로컬 환경에서 함수를 확인할 때 다음 명령을 실행합니다.
shell
sam local invoke
실행 후 Docker를 통해 실행 환경 이미지를 호출하고 함수를 실행합니다.
함수 실행 결과
{ "statusCode": 200, "body": "{\"message\":\"hello world\"}" }
기본적으로 함수는 event 내용이 없는 상태에서 호출되지만 다음과 같이 -e 옵션을 통해 이벤트 대상을 정의한 json 파일을 지정하고 테스트 데이터 등을 지정하여 함수를 실행할 수 있습니다.
shell
sam local invoke -e events/event.json

로컬 환경에서의 작업 확인(APIGateway)


로컬 환경에서 APIGateway를 통한 작업을 확인할 때 다음 명령을 사용하여 로컬에서 API를 시작할 수 있습니다.
shell
sam local start-api
다음 URL에 액세스하여 작업을 확인할 수 있습니다.
shell
http://127.0.0.1:3000/hello
확인이 끝나면 Ctrl+C 등으로 정지한다.

실행 프로그램


다음 명령을 실행하고 디버깅을 시작합니다.
shell
sam deploy --guided
대화식에서 질문을 받기 때문에 대답할 거예요.
shell
Stack Name [sam-app]:
CloudFormation 스택의 이름을 지정합니다.
기본 항목 이름과 같은 이름Enter이 좋을 것 같습니다.
shell
AWS Region [ap-northeast-1]:
구역을 묻다.기본값은 AWSCLI의 인증 정보에 설정된 영역입니다.이번에도 묵인Enter입니다.
shell
#Shows you resources changes to be deployed and require a 'Y' to initiate deploy
Confirm changes before deploy [y/N]:
입력yEnter.
shell
#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]:
집행용 IAM 캐릭터를 제작하느냐는 질문을 받았다.
입력YEnter.
shell
#Preserves the state of previously provisioned resources when an operation fails
Disable rollback [y/N]:
만약 자원 공급이 실패한다면 원래의 상태로 되돌아갈 것이다.
입력yEnter.
shell
HelloWorldFunction may not have authorization defined, Is this okay? [y/N]:
인증을 설정하지 않은 기능에 문제가 없느냐는 질문을 받았다.(일반인 방문이 가능하기 때문)
입력yEnter.
shell
Save arguments to configuration file [Y/n]:
이번에 입력한 값이 설정 파일에 저장되었는지 물었습니다.
입력YEnter.
shell
SAM configuration file [samconfig.toml]:
저장할 프로파일 이름을 입력합니다.기본값은 samconfig.toml입니다.
이번엔 그냥 눌러Enter.
shell
SAM configuration environment [default]:
SAM에 대한 설정은 환경별로 분류하여 설정할 수 있으며, 이 설정에 따라samconfig.toml에서 [default.deploy.parameters],text.deploy.parameters] 방식으로 파라미터를 분리하여 설정할 수 있다.
deploy를 실행할 때 지정한 --config-env 옵션을 통해 default 이외의 deploy를 실행할 수 있습니다.또한 --config-file 옵션에서 사용하는toml 파일을 전환할 수 있습니다.
이번에는defaultEnter를 누르세요.
shell
Deploy this changeset? [y/N]:
입력yEnter.
리소스 사전 설정 및 함수 사전 설정을 수행합니다.
콘솔에 배치된 리소스Outputs가 표시됩니다.
CloudFormation outputs from deployed stack
-------------------------------------------------------------------------------------------------------------------------------
Outputs
-------------------------------------------------------------------------------------------------------------------------------
Key                 HelloWorldFunctionIamRole
Description         Implicit IAM Role created for Hello World function
Value               arn:aws:iam::<ACCOUNT ID>role/sam-app-HelloWorldFunctionRole-UZPLZBVT71MY

Key                 HelloWorldApi
Description         API Gateway endpoint URL for Prod stage for Hello World function
Value               https://xxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/

Key                 HelloWorldFunction
Description         Hello World Lambda Function ARN
Value               arn:aws:lambda:ap-northeast-1:<ACCOUNT ID>:function:sam-app-HelloWorldFunction-xxxxxxxxxx
-------------------------------------------------------------------------------------------------------------------------------

Successfully created/updated stack - sam-app in ap-northeast-1
SAM의 Deploy를 실행하여 AWS에 다음과 같은 자원을 만들었습니다.
  • IAM Role: 함수의 실행 기능.sam-app-HelloWorldFunctionRole-xxxxxxxx 등의 이름으로 생성됩니다.xxxxxxxx 부분에 자동으로 발생하는 해시 값을 설정합니다.
  • API Gateway: 함수를 호출하는 API Gateway입니다.sam-app라는 이름으로 제작되었습니다.
  • Lambda 함수: sam-app-HelloWorldFunction-xxxxxxxx라는 이름으로 lambda 함수를 만듭니다.xxxxxxxx 부분에 자동으로 발생하는 해시 값을 설정합니다.
  • CloudFormation 스택: 구축된 리소스의 스택을 관리합니다.Stack Name [sam-app]:에 설정된 이름으로 생성됩니다.삭제한 후에 만든 자원 클래스도 삭제됩니다.
  • 또한 2차 이후의 depro는 --guided 옵션 없이 실행할 수 있습니다.
    shell
    sam deploy
    

    동작 확인


    SAM의 deploy를 확인할 때 콘솔에 표시되는API Gateway endpoint URL 값이나 AWS 콘솔에서 제작된 API Gateway의 URL을 확인하고 브라우저를 통해 접근합니다.
    URL 만들기 예
    https://xxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/hello
    
    응답
    { "message": "hello world" }
    
    API가 성공적으로 디버깅되었음을 확인합니다.

    자원 삭제


    AWS에 대한 디버깅과 동작 확인을 완료하고 자원을 삭제합니다.
    AWS SAM에서의 자원 생성은 CloudFormation 창고에서 이루어지기 때문에 창고를 삭제하면 링크된 자원을 삭제할 수 있지만 SAM에서는 프로젝트 폴더에서 다음과 같은 작업을 통해 자원을 삭제할 수 있습니다.
    sam delete
    
    IAM 스크롤, API Gateway, Lambda 함수를 삭제합니다.

    총결산


    AWS SAM을 사용하면 로컬 환경/명령줄로부터의 조작을 통해 함수 제작, 로컬 환경의 동작 확인, AWS 환경의 디자인 등을 간단하게 조작할 수 있다.
    Servales가 개발한 생산성을 높이면서 프로젝트의 발전을 추진하는 데 필요한 기술이라고 생각한다.
    다음에도 로컬 다이나모DB와 협업한 개발 환경을 시도해 보고 싶다.

    좋은 웹페이지 즐겨찾기