- Published on
AWS Serverless基礎
- Authors
- Name
- Kikusan
- AWS SAM
- sam init
- sam build
- python Lambdaに依存関係を追加する
- python layerをbuildする
- sam local invoke
- sam local start-api, start-lambda
- sam validate, package, deploy
- sam logs
- スタックの削除
- serverless framework
- AWS CodeCommit
- AWS CodeBuild
- AWS CodePipeline
- localstackでテスト
- ユニットテストのベストプラクティス
AWS SAM
AWS SAMはAWS CloudFormationを単純化し、サーバーレスアプリを構築、テスト、デプロイするリソース管理システムである。
YAMLファイルでスタックを定義する。
sam init
新規、もしくはtemplateからアプリケーションを構築する
sam init --runtime nodejs14.x
sam build
アプリケーションをビルドする。
記述したコードなんかは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で渡せる
- https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-local-invoke.html
- https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-local-generate-event.html
cd sam-app
sam local invoke HelloWorldFunction -e ./events/event.json
sam local start-api, start-lambda
アプリケーションをローカルで実行
- https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-local-start-api.html
- https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-local-start-lambda.html
# ローカルでlambda起動
sam local start-lambda
# ローカルでapi起動
sam local start-api
sam validate, package, deploy
# templateが正しい構文になっているかを確認
sam validate
deployコマンドでデプロイができる。 昔はsam packageを介さないとできなかったが、今は暗黙的にsam deploy --guidedでpackageも行われる
- https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-package.html
- https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-deploy.html
# ガイド付き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
スタックの関数の論理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 ・・・