SAMを使ってみる
SAMのハンズオンをやってみた。
SAMとは、Serverless Application Modelの接頭辞で、サーバレスアプリケーションを素早く開発するためのツールセットです。CloudFormationにより、必要なリソースのデプロイが行われます。今回は、Cloud9環境を用いてハンズオンを行いました。
大きな流れは以下の通りです。
- サーバレスアプリケーションの雛形作成(
sam init
) - コーディング
- ビルド(
sam build
) - ローカル環境でのテスト(
sam local start-api
) - デプロイ(
sam deploy
)
sam init
今回は、以下のような構成を取りました。
- テンプレートの種類: AWS Quick Start Templates
- 使用するテンプレート: Serverless API
- ランタイム: Node.js 16.x
- X-Rayの使用有無: No X-Ray
- アプリケーション名: sam-app
sam init
以下のとおり選択していきます。
|
|
ディレクトリ構成を確認しておきます。
.
├── buildspec.yml
├── env.json
├── events
│ ├── event-get-all-items.json
│ ├── event-get-by-id.json
│ └── event-post-item.json
├── package.json
├── README.md
├── src
│ └── handlers
│ ├── get-all-items.js
│ ├── get-by-id.js
│ └── put-item.js
├── template.yaml
└── __tests__
└── unit
└── handlers
├── get-all-items.test.js
├── get-by-id.test.js
└── put-item.test.js
buildspec.yml
: CodeBuildの動作を決めるための定義ファイルです。アーティファクトはS3にZIP形式で置かれるようです。src/handlers/*.js
: ソースコードの実体です。CFnのtemplate.yaml
から参照されているとおり、このソースコードがLambda関数の実体になります。__tests__/unit/handlers/*.js
: テストコードです。buildspec.yml
で、pre_build
フェーズで実行されるようになっています。events/*.json
: Lambda関数を起動するときに使う起動イベントの定義です。Invocation events that you can use to invoke the function.env.json
:sam local invoke --env-vars env.json
とすることで、template.yaml
に記載されている内容をオーバーライドできる仕組みのためのもののようです(ローカルでの Lambda 関数の呼び出し)。
cd sam-app; sam build
で実行できます。
cd sam-app
sam build
以下のように出力されます。
- アーティファクト:
.aws-sam/build
- ビルドに使用したテンプレート:
.aws-sam/build/template.yaml
Building codeuri: /home/ec2-user/environment/sam-app runtime: nodejs16.x metadata: {} architecture: x86_64 functions: getAllItemsFunction, getByIdFunction, putItemFunction
Running NodejsNpmBuilder:NpmPack
Running NodejsNpmBuilder:CopyNpmrcAndLockfile
Running NodejsNpmBuilder:CopySource
Running NodejsNpmBuilder:NpmInstall
Running NodejsNpmBuilder:CleanUpNpmrc
Running NodejsNpmBuilder:LockfileCleanUp
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
以下のコマンドにより、ローカル環境でテストできるエンドポイントが提供されます。
sam local start-api
template.yaml
で定義された3つのハンドラーに対し、それぞれエンドポイントが提供されていることが分かります。
|
|
ここで、Cloud9で別のターミナルを開き、getAllItemsFunction
を呼び出してみます。
curl http://localhost:3000/
当然ですが、DynamoDBが適切にセットアップされていないのでエラーが返ってきます。また、一番最初にgetAllItemsFunction
を呼び出すときには、Dockerコンテナイメージのダウンロードが行われるため、ややレスポンスが悪いです。
|
|
なんとなく動いたことの確認ができたので、デプロイしてみます。
sam deploy --guided
少々ログが長いので、sam-deploy.logに置いておきました。
--guided
をつけてsam deploy
を起動すると、スタック名やリージョン等が聞かれます。聞かれた内容はsamconfig.toml
に記載され、今後はsam deploy
を実行するだけで自動的にデプロイされます。
version = 0.1
[default]
[default.deploy]
[default.deploy.parameters]
stack_name = "sam-app"
s3_bucket = "aws-sam-cli-managed-default-samclisourcebucket-1ae5e5y3ql961"
s3_prefix = "sam-app"
region = "ap-northeast-1"
confirm_changeset = true
capabilities = "CAPABILITY_IAM"
disable_rollback = true
image_repositories = []
実行コマンド
curl -X POST -H "Content-Type: application/json" -d '{"id":"1", "name":"sonohen"}' https://su7cqge7o3.execute-api.ap-northeast-1.amazonaws.com/Prod/
curl -X POST -H "Content-Type: application/json" -d '{"id":"2", "name":"sonohen2"}' https://su7cqge7o3.execute-api.ap-northeast-1.amazonaws.com/Prod/
戻り値
{"id":"1","name":"sonohen"}
{"id":"2","name":"sonohen2"}
実行コマンド
curl https://su7cqge7o3.execute-api.ap-northeast-1.amazonaws.com/Prod/
戻り値
[{"id":"2","name":"sonohen2"},{"id":"1","name":"sonohen"}]
実行コマンド
curl https://su7cqge7o3.execute-api.ap-northeast-1.amazonaws.com/Prod/1 # {"id":"1","name":"sonohen"} should be returned
戻り値
{"id":"1","name":"sonohen"}
sam delete
出力例
Are you sure you want to delete the stack sam-app in the region ap-northeast-1 ? [y/N]: y
Are you sure you want to delete the folder sam-app in S3 which contains the artifacts? [y/N]: y
- Deleting S3 object with key sam-app/11e6ad52d95b7ff61f7c5edee5989cc5
- Could not find and delete the S3 object with the key sam-app/11e6ad52d95b7ff61f7c5edee5989cc5
- Could not find and delete the S3 object with the key sam-app/11e6ad52d95b7ff61f7c5edee5989cc5
- Deleting S3 object with key sam-app/a4776539efacb8d6b52ef4f5bcf5a08e.template
- Deleting Cloudformation stack sam-app
Deleted successfully
正直、SAMのハンズオンをやるかは、ものすごく悩んだ。DVAの教科書を見れば、コマンドの実行例とともにSAMの紹介がなされており、それを読めば十分だろうと思っていたからです。ただ実際にやってみると、SAMでHello Worldレベルのことをやるのに、このブログでメモを取りながらでも1時間くらいだし、最後、環境をきれいに削除してしまうのもCFnならではだなと思いました。実際に時間を使ってやってみると、自分の過去の似たような案件と比較してしまう…いや、してしまうという残念な感じよりも、このプロセスそのものが次の案件に向けては重要なんだろうなと思いました。