Serverless Framework를 만져봤어요.

ServerlessFramework 설치부터 기본적인 설정과 조작 방법을 확인하고 싶습니다.
이번에 우리는 AWS를 공급업체로 하여 파이톤3에서 서비스를 제작할 것이다.
■설치
# Serverless Framework 설치
node.nvm에 js를 설치합니다.
# nvm インストール
#   https://github.com/nvm-sh/nvm#installing-and-updating
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash

# 最新のltsをインストールしてグローバルに設定
nvm install --lts
nvm use --lts

# インストールされているか確認
node -v
npm --version

# serverless frameworkのインストール
sudo npm install -g serverless
sls --version
#docker 설치
Python의 외부 프로그램 라이브러리를 사용할 때 필요하기 때문에 설치합니다.
Amazon ECS에서 Docker의 기본 설치
# Pythonの外部ライブラリをパッケージングするときに必要になる
sudo amazon-linux-extras install docker
sudo systemctl enable docker.service
sudo systemctl start docker.service

# ec2-userをdockerグループに追加してsudoなしでdockerを操作できるようにする
sudo usermod -a -G docker ec2-user

# 一度ログアウトして再ログイン
#공급자 계정 설정
AWS 콘솔에서 Serverless Framework용 IAM 사용자를 릴리즈합니다.
무엇이든 할 수 있도록 먼저 AdministratorAccess 정책을 수립하십시오.
■ 기본 운영
# 프로젝트 제작
# --template: AWSをプロバイダとしてPython3でプロジェクトを作成する場合は aws-python3 を指定
# --name: 命名規則は ^[a-zA-Z][0-9a-zA-Z-]+$
# --path: プロジェクトを作成するパスを指定します。
sls create --template aws-python3 --name translator --path translator
#로컬에서 기능 수행
로컬 실행 프로그램 앞의 함수입니다.
# --function <FUNCTION_NAME>: 実行する関数名を指定します。
# -p <EVENT_FILE>: ファンクション実行時に引数にわたるevent(json形式)を指定することができます。
sls invoke local --function hello -p event.json
#프로그램
# --stage <STAGE_NAME>: servers.ymlのprovider.stageをデプロイ時に指定することができます。(default=dev)
# --region <REGION>: servers.ymlのprovider.regionをデプロイ時に指定することができます。
sls deploy --stage prod --region ap-northeast-1 

# ファンクション単位でデプロイしたい場合
sls deploy function -f <yourfunction>
# 터미널에서 디버깅된 함수 실행
터미널에서 디버깅된 함수를 실행합니다.
# --function <FUNCTION_NAME>: 実行する関数名を指定します
# -p <EVENT_FILE>: ファンクション実行時に引数にわたるevent(json形式)を指定することができます
sls invoke --function hello -p event.json
# 로그
지정된 함수의 로그를 찾습니다.
# --function <FUNCTION_NAME>: 対象の関数名を指定します
# -t: ログをtailします
sls logs --function hello
#Giithub의 서비스 로컬 가져오기
# ふつうにgit cloneしてもOK
sls install -u <GITHUB URL OF SERVICE>

cd <PROJECT>
npm install
# 플러그인 설치
sls plugin install -n <PLUGIN_NAME>
# 서비스 삭제
sls remove -v
■ Python의 외부 프로그램 라이브러리를 사용하려면
serverless-ptyhon-requirements 플러그인을 사용합니다.
Serverless Python Requirements | Serverless
#serverless-ptyhon-requirements 설치
# インストール
sls plugin install -n serverless-python-requirements
설치 후 다음 설정이 추가됩니다.
serverless.yml
plugins:
    - serverless-python-requirements
custom:
    PythonRequirements: # deploy時のパッケージングの際にpythonライブラリのビルドをdockerコンテナ上で行う設定です。
        dockerizePip: true
#venv 설정
Serverless Framework 자체의 구조로서 venv에서 파이톤 라이브러리를 관리할 필요는 없지만 관리하기 쉬우므로 venv를 이용한다.
venv 가상 환경에activatesls invoke local를 진행하면 로컬에서 함수를 실행할 수 있습니다.
cd <PROJECT_NAME>

# .venvディレクトリに仮想環境を作成して、仮想環境を有効化します。
python3.8 -m venv .venv
source .venv/bin/activate

# ライブラリをインストールして、requirements.txtに書き込見ます。
pip install numpy boto3
pip freeze > requirements.txt
#프로그램
그리고 디버그 명령만 실행하면 Requirements가 됩니다.txt에 적힌 프로그램 라이브러리를 잘 포장하여 디자인하였습니다.
※ numby 등 바이너리로 구축해야 하는 패키지는 도커 컨테이너(최초 설치된 소프트웨어)에 구축되며, 램파도 정상적으로 작동할 수 있습니다.
sls deploy
■ serverless.파일의 설정 항목
# service
서비스 이름을 정의합니다.초기 상태를 유지하면 됩니다.
servers.yml
service: translator
# frameworkVersion
프레임 버전을 정의합니다.초기 상태를 유지하면 됩니다.
servers.yml
frameworkVersion: '2'
# provider
프로젝트의 기본 정보(예: 공급업체 이름, 운행 시간 및 구역)를 정의합니다.
serveless.yml
provider:
  name: aws
  runtime: python3.8
  lambdaHashingVersion: 20201221
  region: ap-northeast-1 # デプロイするリージョンを定義します。deployコマンドの--regionでデプロイ時に指定することも可能
  stage: dev # デプロイするステージ情報を定義します。deployコマンドの--stageでデプロイ時に指定することも可能
# package
패키지에 포함할 파일을 패턴으로 정의합니다.
정의된 패턴은 후승이기 때문에 모든 파일을 제거하고 필요한 파일만 지정하면 사용하기 쉽다.
servers.yml
package:
  patterns:
    - '!**' # すべてのファイルをexclude
    - 'static/**' # staticディレクトリは以下をinclude
    - 'handler.py' # handler.pyをinclude
# functions
함수 실행의 시작점 이벤트와 이벤트가 발생할 때 실행되는 함수를 정의합니다.
  • handlerファイル名.関数名 형식 지정 함수.
  • events
    API Gateway를 사용하는 http 이벤트, S3 작업을 트리거로 하는 이벤트 등 다양한 이벤트를 정의할 수 있습니다.
    https://serverless.com/framework/docs/providers/aws/events
  • serverless.yml
    functions:
      translate:
        handler: handler.translate # handler.pyのtranslate関数を呼び出します。
        role: TranslateRole # resourceセクション(後述)で作成したIAMロールをlambdaに設定します。(未指定の場合はデフォルトのロールが利用されます)
        events: 
          - http: # API Gatewayを利用したhttpイベントを設定します。
              path: /translate # /translateにPOSTアクセスされたときに関数を実行します。
              method: post
              cors: true # CORSを許可するオプションみたいですが、効いていない気がします、、、
      static:
        handler: handler.static # handler.pyのstatic関数を呼び出します。
        role: BaseRole
        events:
          - http:
              path: "/static/{any+}" # {hoge} でプレースホルダを設定できます。{hoge+} とするとワイルドカードになります。
              method: get
    
    # resources
    CloudFormation의 템플릿을 직접 기술할 수 있습니다.
    이번에는 람바다 함수에 사용되는 IAM 역할을 정의했다.
    serverless.yml
    resources:
      Resources:
        BaseRole: # handler.static関数にアタッチするロール
          Type: AWS::IAM::Role
          Properties:
            RoleName: translator-role-lambda-base
            ManagedPolicyArns:
              - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
            AssumeRolePolicyDocument:
              Version: "2012-10-17"
              Statement:
                - Effect: Allow
                  Action:
                    - sts:AssumeRole
                  Principal:
                    Service:
                      - lambda.amazonaws.com
        TranslateRole: # handler.translate関数にアタッチするロール
          Type: AWS::IAM::Role
          Properties:
            RoleName: translator-role-lambda-translate
            ManagedPolicyArns:
              - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
              - arn:aws:iam::aws:policy/service-role/AWSLambdaDynamoDBExecutionRole
              - arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole
              - arn:aws:iam::aws:policy/TranslateFullAccess
            AssumeRolePolicyDocument:
              Version: "2012-10-17"
              Statement:
                - Effect: Allow
                  Action:
                    - sts:AssumeRole
                  Principal:
                    Service:
                      - lambda.amazonaws.com
    
    # plugins
    사용할 플러그인을 정의합니다.sls plugin install 명령으로 플러그 인을 설치하면 자동으로 추가됩니다.
    serverless.yml
    plugins:
      - serverless-python-requirements
    
    # custom
    Docoment에서 항목을 찾을 수 없지만 플러그인 등 개별적으로 설정된 영역을 설명합니까
    servers.yml
    custom:
      pythonRequirements:
        dockerizePip: true
    
    ■ 간단한 번역 애플리케이션
    학습한 내용을 바탕으로 번역 소프트웨어를 만들어 보았다.


    ■참고보도
  • https://serverless.com/
  • https://serverless.co.jp/blog/25/
  • 좋은 웹페이지 즐겨찾기