Published on

AWS Serverless基礎

Authors
  • avatar
    Name
    Kikusan
    Twitter

AWS SAM

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-getting-started.html

AWS SAMはAWS CloudFormationを単純化し、サーバーレスアプリを構築、テスト、デプロイするリソース管理システムである。
YAMLファイルでスタックを定義する。

sam init

新規、もしくはtemplateからアプリケーションを構築する

https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-init.html

sam init --runtime nodejs14.x 

sam build

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-build.html

アプリケーションをビルドする。
記述したコードなんかはbuildしなくても反映されるが、
依存関係(requirements.txt or package.json)を修正したときはbuildしないと反映されない。
.aws-samフォルダにビルドしたものが出力される。

python Lambdaに依存関係を追加する

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: hello_world/
      Handler: app.lambda_handler
      Runtime: python3.8

CodeUri直下にrequirements.txtを配置しておくことで、build時に関数に依存関係を追加してくれる。

python layerをbuildする

Resources:
  ModuleLayer:
    Type: AWS::Serverless::LayerVersion
    Properties:
      LayerName: ModuleLayer
      ContentUri: "layers/module_layer/"
      CompatibleRuntimes: 
        - python3.8
    Metadata:
      BuildMethod: python3.8

ResourcesのLayerにBuildMethodを指定して、
ContentUri直下にrequirements.txtを配置しておくと、build時に自動でlayerを作成してくれる。

sam local invoke

lambdaをローカルでテスト eventを-eで渡せる

cd sam-app
sam local invoke HelloWorldFunction -e ./events/event.json

sam local start-api, start-lambda

アプリケーションをローカルで実行

# ローカルでlambda起動
sam local start-lambda 
# ローカルでapi起動
sam local start-api

sam validate, package, deploy

# templateが正しい構文になっているかを確認
sam validate

deployコマンドでデプロイができる。 昔はsam packageを介さないとできなかったが、今は暗黙的にsam deploy --guidedでpackageも行われる

# ガイド付きdeploy
sam deploy --guided 
# 手動package&deploy
sam deploy --stack-name sam-app --s3-bucket bucket-name
# もしくは
sam package --template-file .aws-sam/build/template.yaml --output-template-file sam.yaml --s3-bucket bucket-name
sam deploy --template-file sam.yaml --stack-name sam-app --capabilities CAPABILITY_IAM

sam logs

https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-logs.html

スタックの関数の論理IDを使用して、Lambda関数のcloudwatchログを見られる

sam logs -n HelloWorldFunction --stack-name sam-app --tail

スタックの削除

cloudformationからスタックを指定して削除するか、awsコマンドをたたく

aws cloudformation delete-stack --stack-name sam-app --region us-west-2

serverless framework

node.jsでつくられたCLIツールで、様々な言語、様々なプラットフォームでサーバーレスアプリ構築ができる。

documentはプラットフォームごとにguideがある。

# install
npm install -g serverless
# create service
mkdir sls
cd sls
# https://www.serverless.com/framework/docs/providers/aws/guide/services/
sls create -t aws-nodejs -p my-special-service

この時serverless.ymlが生成され、これがサービス全体の設定を保存するファイルとなる。

cd my-special-service
sls deploy

deployコマンドでは環境変数(.aws)に指定されている認証情報を使用してデプロイされる

sls remove # スタック削除

AWS CodeCommit

https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/welcome.html

CodeCommitコンソールからプライベートGitリポジトリを生成できる。
IAMの認証情報欄にCodeCommit用のGitアクセス認証情報がある。

AWS CodeBuild

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/welcome.html

CodeBuildコンソールからソースをビルドするコマンドの設定ができる。

  • ソース : ソースコードの場所
  • 環境 : コンテナ環境。デフォルトコンテナとdockerが使える
  • アーティファクト : 生成されるファイルのこと。置き場所にS3を指定できる
  • buildspec.yml : ソースルートにBuildコマンドを配置できる
version: 0.2
# serverless frameworkの場合
# 環境変数に以下を設定しておく
# AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_DEFAULT_REGION
phases:
  install:
    commands:
      - echo Installing Serverless...
      - npm install -g serverless 
  pre_build:
    commands:
      - echo Installing source NPM dependencies...
      - npm install
  build:
    commands:
      - echo Deployment started on `date`
      - echo Deploying with Serverless Framework
      - sls deploy -v -s $ENV_NAME
  post_build:
    commands:
      - echo Deployment completed on `date`

AWS CodePipeline

https://docs.aws.amazon.com/ja_jp/codepipeline/latest/userguide/welcome.html

CodePipelineコンソールからCI/CDの設定ができる。
CodeCommitをトリガー, CodeBuildをビルドコマンド, CodeDeployをデプロイコマンドとして繋げられる。
他のプロバイダを利用したり、手動承認フェーズを入れることもできる。

開発環境ステージ -> developブランチ
本番環境ステージ -> masterブランチ

このように分けて設定することで簡単に移行を済ませることができる。

localstackでテスト

https://github.com/localstack/localstack

docker単体か、docker + pipでローカルでAWSリソースを立てることができる。

#pipの場合
pip install localstack
localstack start
# localhost:4566 で{"status": "running"} が表示されれば、立ち上がっている。
# dockerの場合
# localstack公式のgithubのrootにあるdocker-compose.ymlをコピーしてきて、
docker-compose up -d # 起動
docker-compose down # 停止

ユニットテストのベストプラクティス

AWSリソースをlocalstackでテストする場合、
リソースを引数として渡す関数をハンドラから分離することで、 テスト時はエンドポイントを変えてテストすることができる。

# メインロジック関数
def main(event, context, s3client):
    # ・・・
    s3client.upload_file(file_path, bucket_name, file_name)
# ハンドラ関数
s3client = boto3.client('s3')

def lambda_handler(event, context):
    main(event, context, s3client)
# テストコード
s3client = boto3.client('s3', endpoint_url='http://localhost:4566')

def test_s3():
    # ・・・
    main(event, context, s3client)
    # assert ・・・