この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
いわさです。
SAM CLIにSAM Accelerate
というベータ機能が公開されました。
本日は以下のAWSブログを触ってみて、今までと比べて何が違うのかなどをまとめてみました。
最初に、まとめ
いままで
- AWS上でSAMを実行・テストする場合に、
sam build
とsam deploy
を行う必要がある - 開発とテストを繰り返すフェーズにおいて、上記のビルドとAWSへのデプロイの時間はボトルネックになる
- 上記開発サイクルを効率的に循環させるためにSAMには
sam local
というローカル実行機能を使うことが出来る
今回のアップデート
- 今回のベータ機能ではビルドとAWSへのデプロイを効率的に繰り返すことが出来るオプションが用意された
sam sync
を使って、samconfig.tomlの用意なし・変更セットの確認なしですぐにデプロイ。ビルドも自動。sam sync --code
オプションを使って、ローカルファイルの変更を検知してコードのみを自動で即反映sam build --cached
オプションを使うと、ビルド時に変更があったコードのみがビルド対象。変更のないものはキャッシュが使われてビルドスキップ。
いままで
今まで私はSAMを使った開発をしていなかったものですから、まず従来がどうだったのかをインプットしました。
DevelopersIOにいくつかSAMの記事があって、割と時系列にまとまっていますのでとても参考になりました。
どの記事も参考になったのですが、特に以下の2つをまず取り上げたいと思います。
こちらはsam local
を使ったSAMローカル実行の紹介記事です。
記事の最後には以下のようにもまとめられています。
SAMで定義したアプリケーションをローカルでテストし、そのままAWS環境へデプロイできるようになります。AWS上に開発環境を用意するとデプロイに時間がかかり、インタラクティブなテストが難しかったですが、ローカルでも実行できるようになりました。
こちらはAWSへSAMをデプロイする流れがわかる紹介記事です。
従来まではAWSへデプロイするまでにバケットの用意、sam package
の実行など必要でしたが、samconfig.toml
を用意した2回目以降はsam deploy
のみで継続実行出来るようになったというものでした。
といっても、明示的なビルドや変更セットを作成してからのデプロイという流れになっていました。
sam sync
最新のSAM CLIで利用可能です。
iwasa.takahito@hoge ~ % sam --version
SAM CLI, version 1.34.1
iwasa.takahito@hoge ~ % sam -h
Usage: sam [OPTIONS] COMMAND [ARGS]...
AWS Serverless Application Model (SAM) CLI
...
Commands:
init Init an AWS SAM application.
validate Validate an AWS SAM template.
build Build your Lambda function code
local Run your Serverless application locally for quick development &...
package Package an AWS SAM application.
deploy Deploy an AWS SAM application.
delete Delete an AWS SAM application and the artifacts created by sam
deploy.
logs Fetch logs for a function
publish Publish a packaged AWS SAM template to the AWS Serverless
Application Repository.
traces [Beta Feature] Fetch AWS X-Ray traces
sync [Beta Feature] Sync a project to AWS
pipeline Manage the continu
sam deploy
のようなguided
オプションによるsamconfig.toml
作成を初回から不要という点もありますが、sam deploy
との大きな違いとしては、変更セットを使用しない点でしょうか。
--codeオプション
codeオプションを使うと、SAM一式をデプロイせずにコードのみ反映することが可能です。
sync
コマンド自体で速くなりましたが、さらに絞った使い方です。
数秒で反映されます。
iwasa.takahito@hoge blog % sam sync --stack-name blog --profile hoge --code
Managed S3 bucket: aws-sam-cli-managed-default-samclisourcebucket-cilfpsz3vif3
A different default S3 bucket can be set in samconfig.toml
Or by specifying --s3-bucket explicitly.
Default capabilities applied: ('CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND')
To override with customized capabilities, use --capabitilies flag or set it in samconfig.toml
This feature is currently in beta. Visit the docs page to learn more about the AWS Beta terms https://aws.amazon.com/service-terms/.
The SAM CLI will use the AWS Lambda, Amazon API Gateway, and AWS StepFunctions APIs to upload your code without
performing a CloudFormation deployment. This will cause drift in your CloudFormation stack.
**The sync command should only be used against a development stack**.
Confirm that you are synchronizing a development stack and want to turn on beta features.
Enter Y to proceed with the command, or enter N to cancel:
[y/N]: y
Syncing RestApi BaseApi...
Syncing Lambda Function GreetingFunction...
Syncing Lambda Function HelloWorldFunction...
Resource BaseApi does not have DefinitionUri specified. Skipping the sync. Try sam sync without --code or sam deploy.
Manifest is not changed for 3ce3c681-ee50-406e-82f5-9c55dcf6b27d, running incremental build
Building codeuri: /Users/iwasa.takahito/work/blog/hello_world runtime: python3.9 metadata: {} architecture: x86_64 functions: ['HelloWorldFunction']
Manifest is not changed for 48afed09-2668-4c04-9722-490b5b1b173d, running incremental build
Building codeuri: /Users/iwasa.takahito/work/blog/greeting runtime: python3.9 metadata: {} architecture: x86_64 functions: ['GreetingFunction']
Running PythonPipBuilder:CopySource
Running PythonPipBuilder:CopySource
Finished syncing Lambda Function HelloWorldFunction.
Finished syncing Lambda Function GreetingFunction.
iwasa.takahito@hoge blog %
ここで定義されるコードとは以下を指しています。
AWS Lambda function code.
AWS Lambda layer resources.
AWS Step Functions templates in Amazon States Language form.
Amazon API Gateway OpenAPI documents identified in the CodeUri parameter.
そして、リソース種別やリソースIDにさらに絞った同期オプションも用意されています。
iwasa.takahito@hoge blog % sam sync --stack-name blog --code --resource AWS::Serverless::Function --profile hoge
iwasa.takahito@hoge blog % sam sync --stack-name blog --code --resource-id HelloWorldFunction --profile hoge
なお、リソースタイプとして指定可能な項目は以下です。
- AWS::Serverless::Function
- AWS::Serverless::Api
- AWS::Serverless::HttpApi
- AWS::Serverless::StateMachine
--watchオプション
これが特にすごいなと思ったのですが、ローカルファイルの変更をウォッチし、保存したときに即クラウドへ反映するオプションです。
sam sync --watch
オプションでウォッチモードになります。
その状態でLambda関数を変更し、ローカルでファイル保存してみましょう。
すぐに同期処理が動きました。
Lambdaポータルからも確認が出来ます。
sam build --cached
sam build
時の依存関係モジュールのダウンロードやコードのビルドを実行しますが、依存関係が変更されていない場合はキャッシュを利用し、アプリケーションコードのみをビルドする機能です。
さいごに
一点だけご注意頂きたいのは、上記は普段SAMでの開発を行っていない私がまとめた情報ということです。
デモを触って机上で内容をまとめただけです。
クラウド上でもSAMを使った開発速度を上げるという思想についてはおそらく合ってるかと思いますが、実用的なのか効果的なのか実際にSAMを使う開発現場の意見はまた違ったものになる可能性もあります。
この機能が提供されたので今後は使っていきましょうねではなくどういうフィードバックが得られるか気になるところです。
なお、AWS SAM CLIはOSSです。
フィードバックも積極的にしていきたいですね。