迅速にクラウド上へ変更を反映出来る、AWS SAM Accelerateがパブリックプレビューになりました

2021.10.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

SAM CLIにSAM Accelerateというベータ機能が公開されました。
本日は以下のAWSブログを触ってみて、今までと比べて何が違うのかなどをまとめてみました。

最初に、まとめ

いままで

  • AWS上でSAMを実行・テストする場合に、sam buildsam 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です。
フィードバックも積極的にしていきたいですね。