AWS Serverless Application Model (AWS SAM) とは何ですか? - AWS Serverless Application Model

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS Serverless Application Model (AWS SAM) とは何ですか?

AWS Serverless Application Model (AWS SAM) は、サーバーレスアプリケーションの構築と実行における開発者の操作性を向上させるツールキットです。 AWS AWS SAM 次のようなさまざまなメリットがあります。

より少ないコードを使用して、アプリケーションインフラストラクチャコードを迅速に定義する

AWS SAM テンプレートを作成してサーバーレスアプリケーションのインフラストラクチャーコードを定義する。 AWS CloudFormation テンプレートを直接デプロイしてリソースをプロビジョニングします。

開発ライフサイクル全体を通じてサーバーレスアプリケーションを管理する

AWS SAM CLI を使用して、開発ライフサイクルの作成、構築、デプロイ、テスト、モニタリングの各フェーズを通じてサーバーレスアプリケーションを管理します。詳細については、「AWS SAM CLI の使用」を参照してください。

AWS SAM コネクタを使用してリソース間の権限を迅速にプロビジョニングできます。

AWS SAM AWS SAM テンプレート内のコネクタを使用して、 AWS リソース間の権限を定義します。 AWS SAM コードを、意図を容易にするために必要な IAM 権限に変換します。詳細については、「AWS SAM コネクタによるリソースに対するアクセス許可の管理」を参照してください。

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

AWS SAMCLIsam syncコマンドを使用してローカルの変更をクラウドに自動的に同期し、開発とクラウドテストのワークフローをスピードアップします。詳細については、「sam sync を使用する」を参照してください。

Terraform サーバーレスアプリケーションを管理する

AWS SAM CLI を使用して、ローカルで Lambda 関数とレイヤーのデバッグやテストを実行します。詳細については、「AWS SAM CLITerraform のサポート」を参照してください。

基本概念

AWS SAM 次の 3 つの主要部分で構成されています。

  1. AWS SAM テンプレート仕様 — サーバーレスアプリケーションのインフラストラクチャーを定義するために使用できるオープンソースのフレームワークです。 AWSこのフレームワークにはテンプレートを通じてアクセスします AWS SAM 。

  2. AWS SAM テンプレート — テンプレート仕様へのアクセスに使用するもの。 AWS SAM テンプレート仕様書は、サーバーレスアプリケーションのインフラストラクチャーを定義するために使用できるオープンソースのフレームワークです。 AWS AWS SAM AWS CloudFormation テンプレートはテンプレートを拡張したもので、使いやすくするためのコンポーネントがいくつか追加されています。

  3. AWS SAM コマンドラインインターフェイス (AWS SAMCLI) — AWS SAM テンプレートやサポートされているサードパーティインテグレーションと組み合わせて使用できるコマンドラインツールで、サーバーレスアプリケーションを構築して実行できます。

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

サーバーレスの概念レビューすることをおすすめします。

AWS SAM テンプレートの仕様は?

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

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

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

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

  • Transformational — AWS SAM テンプレートをインフラストラクチャのプロビジョニングに必要なコードに変換するという複雑な作業を行います。 AWS CloudFormation

テンプレートとは何か? 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: nodejs12.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 CloudFormation でこれらのリソースを生成するのに必要な構文に変換します。 AWS 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 SAMCLIは、 AWS SAM テンプレートやサポートされているサードパーティインテグレーションと組み合わせてサーバーレスアプリケーションを構築して実行できるコマンドラインツールです。 AWS SAM CLI を使用します。

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

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

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

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

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

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

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

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

AWS SAMCLI AWS SAM とテンプレートと組み合わせて使用すると最も効果的です。 AWS CloudFormation Terraform などのサードパーティー製品とも連携します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ここでは、sam deploy --guided コマンドを使用して、インタラクティブフローを通じてアプリケーションをデプロイします。これにより AWS SAMCLI、アプリケーションのデプロイ設定を構成したり、テンプレートをに変換したり AWS CloudFormation、 AWS CloudFormation デプロイしてリソースを作成したりできます。

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

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

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

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

AWS SAMCLIsam pipeline init --bootstrapコマンドを使用して、お好みの CI/CD システムで CI/CD パイプラインを設定します。

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

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

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

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

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

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

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

AWS SAMCLIsam sync AWS コマンドを使用してローカルの変更をクラウドに同期する。

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

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

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

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

詳細はこちら

引き続き学習するには AWS SAM、以下のリソースを参照してください。

  • AWS SAM 完全版ワークショップ — AWS SAM 提供される主な機能の多くを学ぶことを目的としたワークショップです。

  • Sessions with SAM — AWS サーバーレス開発者支援チームが作成した、使い方に関するビデオシリーズ。 AWS SAM

  • Serverless Land — サーバーレス向けの最新情報、ブログ、動画、コード、学習リソースをまとめたサイト。 AWS

次のステップ

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