AWS SAMとは
AWS SAMは、サーバレスアプリケーションを構築するための オープンソース フレームワークであり、数行の設定のみで、必要なアプリケーションを定義できる。AWS SAMは、CloudFormation拡張テンプレート仕様 および AWS SAM CLI コンポーネントから構成される。
AWS SAMを使用することで、関連するコンポーネントとリソースの整理、操作が単一のスタックで管理できる。また、メモリやタイムアウト値などの設定値をリソース間で共有することも可能である。また、CloudFormationの拡張機能 であるため、 CloudFormationに対応するリソースと組み合わせてリソースを管理することができる。
AWS SAMには、ローカルの開発環境でLambda実行環境と同等の機能を提供する。これを用いることで、AWS上にデプロイする前に、ローカルの開発環境で動作や問題等を確認することができる。
また、Lambdaを安全にデプロイするために、 一定期間の間に段階的に新しいバージョンをデプロイすることも可能 である。
SAM の構造
SAMは、CloudFormationのテンプレートファイルの形式に厳格に従う。 Global セクション が追加されており、関数とAPIの共通のプロパティを定義することができる。セキュリティの問題が発生する恐れのあるプロパティ、およびテンプレートの理解を妨げる恐れのあるプロパティは、Globalセクションに対応しない。 Resources テーブルで定義したプロパティは、Globalで指定された値を上書きする 。
SAM リソース
SAMで定義されているリソースは以下の通り。
リソースタイプ | 内容 | 備考 |
---|---|---|
AWS :: Serverless :: Api | APIGatewayリソースとメソッドを作成 | |
AWS::Serverless::Application | 外部のリソースをNested Stackとして作成 | AWS Serverless Application Repository を利用可能 |
AWS::Serverless::Function | Lambdaを作成 | IAMロールやトリガを一括指定可能, 段階的な展開が可能 |
AWS::Serverless::HttpApi | HTTP API を作成 | |
AWS::Serverless::LayerVersion | Lambda Layer Version を作成 | |
AWS::Serverless::SimpleTable | DynamoDB テーブルを作成 | |
AWS::Serverless::StateMachine | Step Functions を作成 |
なお、API Gateway extensions に SAM に対応していないExtensionがある旨の記述があるが、これは ローカルの実行に対応していないとの意味であり、実際にはSAMリソース内で定義することは可能 である。
SAM のビルドとデプロイ
SAM をビルドするためには、 sam build
コマンドを使用する。このコマンドは、 requirements.txt などに記述された 依存関係のあるパッケージを収集し、適切な形式と場所に格納 する。
SAM は CloudFormation のメカニズムを使用してデプロイを行うことができる。 sam deploy
コマンドを実行するとアーティファクトは圧縮され、S3にアップロードされる。これらの作業は、 CodeBuild , CodeDeploy , CodePipeline を用いることで自動化できる。
SAM のモニタリング
sam logs
コマンドを用いることで、Lambda が生成したログをコマンドラインから確認することができる。 tail することや特定の時間帯のログの抽出、ログのフィルタリングを行うことも可能。
SAM の公開
作成した SAM は、 AWS Serverless Application Repository
で公開することができる。
SAM CLI
sam init
プロジェクト名として指定したディレクトリの下に、sam-app
ディレクトリと、SAMプロジェクトおよびサンプルテンプレートを作成する。
sam validate
SAMテンプレートが有効であるかどうか検証する。具体的には、 AM テンプレートから本来の CloudFormation テンプレートの文法に変換できるかを検証するコマンド である。AWS CLI Configureにてデフォルトリージョンを設定していない場合には、以下のように環境変数を与える必要がある。
似た機能である aws cloudformation validate-template コマンドは、CloudFormation テンプレートの構文を検証するコマンドであるため、 sam validate と挙動は異なる。
env AWS_DEFAULT_REGION=ap-northeast-1 sam validate
sam build
sam-app
ディレクトリ直下に .aws-sam
を作成し、この下に、指定した実行環境をターゲットとする デプロイメントアーティファクト を作成する。例えば、LambdaをPythonで記述した場合に、 requirements.txt
にて依存関係のあるライブラリを指定することができるが、 sam build
はこれらの依存関係を適切に処理する。
sam package
デプロイメントアーティファクト を圧縮してS3にアップロードする。また、パッケージ化されたSAMテンプレート(packaged.yaml
)を作成する。パッケージ化されたSAMテンプレートには、S3にアップロードした デプロイメントアーティファクト へのリンク先が記述されている。sam deploy
コマンドは、 sam package
コマンドを暗黙的に実行するため、本来は sam deploy
コマンドを実行するだけでよい。
sam deploy
アプリケーションのデプロイを行う。 --guided
パラメータを付与することで、インタラクティブモードを起動することができる。
sam logs
Lambdaが生成するログを確認することができる。
SAMテンプレート
SAMテンプレートには、 Globals
セクションが設けられており、ランタイムやメモリなどの共通設定をこれに格納することができる。なお、以下のプロパティはサポートされていない。
Function:
Role:
Policies:
FunctionName:
Events:
Api:
StageName:
DefinitionBody:
SAMテンプレートでは、以下のリソースタイプがサポートされている。AWS :: Serverless :: LayerVersion
のみ DeletionPolicy
をサポートしている。また、 AWS :: Serverless :: Api
内で記述するOpenAPIドキュメントは、 一部のAPI Gateway拡張(x-amazon-apigateway-) のみサポートしていることに注意が必要である。
タイプ | 作成されるリソース | 備考 |
---|---|---|
AWS :: Serverless :: Api | API Gateway | OpenAPIを使用してAPIを定義する |
AWS :: Serverless :: Application | SAM | Serverless Application Repositoryのリソースをデプロイ可能 |
AWS :: Serverless :: Function | Lambda, IAM Role | |
AWS :: Serverless :: HttpApi | API Gateway Http Api | |
AWS :: Serverless :: LayerVersion | Lambda Layer Version | |
AWS :: Serverless :: SimpleTable | DynamoDB | プライマリキーのみのテーブルを作成 |
ポリシーテンプレート
SAMでは、Lambdaのアクセス許可をポリシーテンプレートという形で指定することができる。ポリシーテンプレートは、あらかじめAWSが用意したポリシーパターンである。
テスト
sam local
コマンドを用いることでローカルで、API GatewayやLambdaを実行させることができ、開発環境でアプリケーションの動作を検証することができる。