AWS SAM の働き - AWS Serverless Application Model

AWS SAM の働き

AWS SAM は、サーバーレスアプリケーションの作成に使用する 2 つのプライマリコンポーネントで構成されます。

  1. AWS SAM プロジェクトsam init コマンドの実行時に作成されるフォルダとファイルです。このディレクトリには、AWS リソースを定義する重要なファイルである AWS SAM テンプレートが含まれています。このテンプレートには、AWS SAM テンプレート仕様が含まれています。このオープンソースフレームワークには、サーバーレスアプリケーションの関数、イベント、API、設定、アクセス許可を定義するために使用する簡略化された省略構文があります。

  2. AWS SAMCLI — AWS SAM プロジェクトやサポートされているサードパーティーの統合と併用することで、サーバーレスアプリケーションを構築し、実行できるコマンドラインツールです。AWS SAM CLI は、AWS SAM プロジェクトでコマンドを実行し、最終的にサーバーレスアプリケーションに変換するために使用するツールです。

サーバーレスアプリケーションを定義するリソース、イベントソースマッピング、およびその他のプロパティを表すには、AWS SAM テンプレートや AWS SAM プロジェクト内のその他のファイルでリソースを定義し、アプリケーションを開発します。AWS SAM CLI を使用して AWS SAM プロジェクトでコマンドを実行します。これが、サーバーレスアプリケーションを初期化、構築、テスト、デプロイする方法です。

サーバーレスは初めてですか?

AWS Serverless Application Model 向けサーバーレスの概念」を確認することをお勧めします。

AWS SAM テンプレート仕様とは

AWS SAM テンプレート仕様とは、サーバーレスアプリケーションインフラストラクチャコードを定義および管理するために使用できるオープンソースフレームワークです。AWS SAM テンプレート仕様は次のとおりです。

  • AWS CloudFormation での構築 — リソースおよびプロパティ設定の広範なサポートを利用して、AWS SAM テンプレート内で AWS CloudFormation 構文を直接使用します。既に AWS CloudFormation に精通している場合は、アプリケーションインフラストラクチャコードを管理するために新しいサービスを学ぶ必要はありません。

  • AWS CloudFormation の拡張機能 – AWS SAM は、特にサーバーレス開発の高速化に焦点を当てた独自の独自の構文を提供します。同じテンプレート内で AWS CloudFormation および AWS SAM の両方の構文を使用できます。

  • 抽象的で簡潔な構文 – AWS SAM 構文を使用すると、より少ないコード行で、エラーの可能性をより低く抑えながら、インフラストラクチャを迅速に定義できます。その構文は、サーバーレスアプリケーションインフラストラクチャを定義する際の複雑さを抽象化して取り除くために特に精選されています。

  • 変換 – AWS SAM は、テンプレートを変換して、AWS CloudFormation を通じてインフラストラクチャをプロビジョニングするために必要なコードにするという複雑な作業を実行します。

AWS SAM プロジェクトおよび AWS SAM テンプレートとは

AWS SAM プロジェクトには、AWS SAM テンプレート仕様を含む AWS SAM テンプレートが含まれます。この仕様は、サーバーレスアプリケーションインフラストラクチャを AWS で定義するために使用するオープンソースフレームワークで、操作を容易にする追加のコンポーネントがあります。その意味で、AWS SAM テンプレートは AWS CloudFormation テンプレートの拡張です。

基本的なサーバーレスアプリケーションの例を次に示します。このアプリケーションは、HTTP リクエストを通じてデータベースからすべての項目を取得するリクエストを処理します。これは次の部分で構成されます。

  1. リクエストを処理するロジックを含む関数。

  2. クライアント (リクエスタ) とアプリケーション間の通信として機能する HTTP API。

  3. 項目を保存するデータベース。

  4. アプリケーションを安全に実行するための許可。

シンプルなサーバーレスアプリケーションのアプリケーションアーキテクチャ。

このアプリケーションのインフラストラクチャコードは、次の AWS SAM テンプレートで定義できます。

AWSTemplateFormatVersion: 2010-09-09 Transform: AWS::Serverless-2016-10-31 Resources: getAllItemsFunction: Type: AWS::Serverless::Function Properties: Handler: src/get-all-items.getAllItemsHandler Runtime: nodejs20.x Events: Api: Type: HttpApi Properties: Path: / Method: GET Connectors: MyConn: Properties: Destination: Id: SampleTable Permissions: - Read SampleTable: Type: AWS::Serverless::SimpleTable

23 行のコードで、次のインフラストラクチャが定義されます。

  • AWS Lambda サービスを利用した関数。

  • Amazon API Gateway サービスを使用した HTTP API。

  • Amazon DynamoDB サービスを使用するデータベース。

  • これらのサービスが相互にインタラクションするために必要な AWS Identity and Access Management (IAM) 許可。

このインフラストラクチャをプロビジョニングするには、テンプレートを AWS CloudFormation にデプロイします。デプロイ中に、AWS SAM は 23 行のコードを変換して、AWS でこれらのリソースを生成するために必要な AWS CloudFormation 構文にします。変換された AWS CloudFormation テンプレートには 200 行を超えるコードが含まれています。

{ "AWSTemplateFormatVersion": "2010-09-09", "Resources": { "getAllItemsFunction": { "Type": "AWS::Lambda::Function", "Metadata": { "SamResourceId": "getAllItemsFunction" }, "Properties": { "Code": { "S3Bucket": "aws-sam-cli-managed-default-samclisourcebucket-1a4x26zbcdkqr", "S3Key": "what-is-app/a6f856abf1b2c4f7488c09b367540b5b" }, "Handler": "src/get-all-items.getAllItemsHandler", "Role": { "Fn::GetAtt": [ "getAllItemsFunctionRole", "Arn" ] }, "Runtime": "nodejs12.x", "Tags": [ { "Key": "lambda:createdBy", "Value": "SAM" } ] } }, "getAllItemsFunctionRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Action": [ "sts:AssumeRole" ], "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com" ] } } ] }, "ManagedPolicyArns": [ "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" ], "Tags": [ { "Key": "lambda:createdBy", "Value": "SAM" } ] } }, "getAllItemsFunctionApiPermission": { "Type": "AWS::Lambda::Permission", "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { "Ref": "getAllItemsFunction" }, "Principal": "apigateway.amazonaws.com", "SourceArn": { "Fn::Sub": [ "arn:${AWS::Partition}:execute-api:${AWS::Region}:${AWS::AccountId}:${__ApiId__}/${__Stage__}/GET/", { "__ApiId__": { "Ref": "ServerlessHttpApi" }, "__Stage__": "*" } ] } } }, "ServerlessHttpApi": { "Type": "AWS::ApiGatewayV2::Api", "Properties": { "Body": { "info": { "version": "1.0", "title": { "Ref": "AWS::StackName" } }, "paths": { "/": { "get": { "x-amazon-apigateway-integration": { "httpMethod": "POST", "type": "aws_proxy", "uri": { "Fn::Sub": "arn:${AWS::Partition}:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${getAllItemsFunction.Arn}/invocations" }, "payloadFormatVersion": "2.0" }, "responses": {} } } }, "openapi": "3.0.1", "tags": [ { "name": "httpapi:createdBy", "x-amazon-apigateway-tag-value": "SAM" } ] } } }, "ServerlessHttpApiApiGatewayDefaultStage": { "Type": "AWS::ApiGatewayV2::Stage", "Properties": { "ApiId": { "Ref": "ServerlessHttpApi" }, "StageName": "$default", "Tags": { "httpapi:createdBy": "SAM" }, "AutoDeploy": true } }, "SampleTable": { "Type": "AWS::DynamoDB::Table", "Metadata": { "SamResourceId": "SampleTable" }, "Properties": { "AttributeDefinitions": [ { "AttributeName": "id", "AttributeType": "S" } ], "KeySchema": [ { "AttributeName": "id", "KeyType": "HASH" } ], "BillingMode": "PAY_PER_REQUEST" } }, "getAllItemsFunctionMyConnPolicy": { "Type": "AWS::IAM::ManagedPolicy", "Metadata": { "aws:sam:connectors": { "getAllItemsFunctionMyConn": { "Source": { "Type": "AWS::Serverless::Function" }, "Destination": { "Type": "AWS::Serverless::SimpleTable" } } } }, "Properties": { "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:GetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:BatchGetItem", "dynamodb:ConditionCheckItem", "dynamodb:PartiQLSelect" ], "Resource": [ { "Fn::GetAtt": [ "SampleTable", "Arn" ] }, { "Fn::Sub": [ "${DestinationArn}/index/*", { "DestinationArn": { "Fn::GetAtt": [ "SampleTable", "Arn" ] } } ] } ] } ] }, "Roles": [ { "Ref": "getAllItemsFunctionRole" } ] } } } }

AWS SAM を使用して、23 行のインフラストラクチャコードを定義します。AWS SAM は、コードを変換して、アプリケーションのプロビジョニングに必要な 200 行以上の AWS CloudFormation コードに変換します。

AWS SAMCLI とは?

AWS SAM CLI は、AWS SAM テンプレートやサポートされているサードパーティーの統合と併用することで、サーバーレスアプリケーションを構築し、実行できるコマンドラインツールです。AWS SAM CLI を使用します。

  • 新しいアプリケーションプロジェクトを迅速に初期化します。

  • デプロイ用にアプリケーションを構築します。

  • ローカルでのデバッグとテストを実行します。

  • アプリケーションをデプロイします。

  • CI/CD デプロイパイプラインを設定します。

  • クラウド内のアプリケーションをモニタリングおよびトラブルシューティングします。

  • 開発中にローカルの変更をクラウドに同期します。

  • その他にも多くのことを実行できます。

AWS SAM CLI は、AWS SAM および AWS CloudFormation テンプレートとともに使用すると最も効果的に利用できます。Terraform などのサードパーティー製品とも連携します。

新しいプロジェクトを初期化する

スターターテンプレートから選択するか、カスタムテンプレートの場所を選択して、新しいプロジェクトを開始します。

ここでは、sam init コマンドを使用して新しいアプリケーションプロジェクトを初期化します。まず、Hello World サンプルプロジェクトを選択します。AWS SAM CLI はスターターテンプレートをダウンロードし、プロジェクトフォルダのディレクトリ構造を作成します。

AWS SAM CLI で新しいアプリケーションプロジェクトを開始するために sam init を使用します。

詳細については、「AWS SAM でアプリケーションを作成する」を参照してください。

デプロイ用にアプリケーションを構築する

関数の依存関係をパッケージ化し、プロジェクトコードとフォルダ構造を整理して、デプロイの準備をします。

ここでは、sam build コマンドを使用してアプリケーションのデプロイを準備します。AWS SAM CLI は .aws-sam ディレクトリを作成し、そこにアプリケーションの依存関係とファイルをデプロイ用に整理します。

アプリケーションのデプロイを準備するために sam build を使用します。

詳細については、「アプリケーションを構築する」を参照してください。

ローカルでのデバッグとテストを実行する

ローカルマシン上で、イベントのシミュレート、API のテスト、関数の呼び出しなどを実行して、アプリケーションをデバッグおよびテストします。

ここでは、sam local invoke コマンドを使用してローカルで HelloWorldFunction を呼び出します。これを実現するために、AWS SAM CLI はローカルコンテナを作成し、関数を構築して呼び出し、結果を出力します。Docker などのアプリケーションを使用して、マシンでコンテナを実行できます。

AWS SAM CLI sam local invoke コマンドを使用してローカルで関数を呼び出します。

詳細については、「アプリケーションをテストする」および「アプリケーションをデバッグする」を参照してください。

アプリケーションをデプロイします

アプリケーションのデプロイ設定を構成し、AWS クラウドにデプロイしてリソースをプロビジョニングします。

ここでは、sam deploy --guided コマンドを使用して、インタラクティブフローを通じてアプリケーションをデプロイします。AWS SAM CLI は、アプリケーションのデプロイ設定を通じてユーザーにガイドを提供し、テンプレートを AWS CloudFormation に変換し、AWS CloudFormation にデプロイしてリソースを作成します。

AWS SAM CLI sam deploy コマンドを使用してアプリケーションを AWS クラウドにデプロイします。

詳細については、「アプリケーションとリソースをデプロイする」を参照してください。

CI/CD デプロイパイプラインを設定する

サポートされている CI/CD システムを使用して、安全な継続的インテグレーションおよびデリバリー (CI/CD) パイプラインを作成します。

ここでは、sam pipeline init --bootstrap コマンドを使用してアプリケーションの CI/CD デプロイパイプラインを設定します。AWS SAM CLI はオプションを通じてユーザーにガイドを提供し、CI/CD システムで使用する AWS リソースと設定ファイルを生成します。

AWS SAM CLI sam pipeline init --bootstrap コマンドを使用して、優先 CI/CD システムで CI/CD パイプラインを設定します。

詳細については、「CI/CD システムとパイプラインを使用したデプロイ」を参照してください。

クラウド内のアプリケーションをモニタリングおよびトラブルシューティングする

デプロイされたリソースに関する重要な情報を表示し、ログを収集し、AWS X-Ray などの組み込みモニタリングツールを利用します。

ここでは、sam list コマンドを使用してデプロイされたリソースを表示します。API エンドポイントを取得して呼び出し、関数をトリガーします。その後、sam logs を使用して関数のログを表示します。

AWS SAM CLI sam list コマンドを使用して API エンドポイントを取得します。その後、関数のログを表示するために sam logs が使用されます。

詳細については、「アプリケーションをモニタリングする」を参照してください。

開発中にローカルの変更をクラウドに同期する

ローカルマシンで開発すると、変更がクラウドに自動的に同期されます。変更をすばやく確認し、クラウドでテストと検証を実行します。

ここでは、sam sync --watch コマンドを使用して、AWS SAM CLI がローカルの変更を監視するようにします。HelloWorldFunction コードを変更すると、AWS SAM CLI が自動的に変更を検出し、更新をクラウドにデプロイします。

AWS SAM CLI sam sync コマンドを使用して、ローカルの変更を AWS クラウドに同期します。

サポートされているリソースをクラウドでテストする

クラウド内のサポート対象リソースを呼び出して、イベントを渡します。

ここでは、クラウドにデプロイされた Lambda 関数をテストするために sam remote invoke コマンドを使用します。Lambda 関数を呼び出して、そのログとレスポンスを受け取ります。Lambda 関数はレスポンスをストリーミングするように設定されているので、AWS SAM CLI はそのレスポンスをリアルタイムでストリーミングして返します。

AWS SAM CLI sam remote invoke コマンドを使用して、AWS クラウドにデプロイされた関数をテストします。

詳細はこちら

AWS SAM の詳細については、次のリソースを参照してください。

次のステップ

AWS SAM を初めて使用する場合は、「AWS SAM の開始方法」を参照してください。