AWS SAM の仕組み - AWS Serverless Application Model

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

AWS SAM の仕組み

AWS SAM は、サービスレスアプリケーションの作成に使用する 2 つの主要コンポーネントで構成されています。

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

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

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

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

を確認することをお勧めしますサーバーレスの概念

AWS SAM テンプレートの仕様は何ですか?

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

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

  • の拡張 AWS CloudFormation- サーバーレス開発の高速化に特に重点を置いた独自の構文 AWS SAM を提供します。同じテンプレート内で AWS CloudFormation 構文と AWS SAM 構文の両方を使用できます。

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

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

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: 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にデプロイします。デプロイ中、 は 23 行のコードを、 でこれらのリソースを生成するために必要な AWS CloudFormation 構文 AWS SAM に変換します 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 行のインフラストラクチャコードを定義します。 は、アプリケーションのプロビジョニングに必要な 200 行以上の AWS CloudFormation コードにコードを AWS SAM 変換します。

とは 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 init コマンドを使用してアプリケーションを作成する」を参照してください。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

詳細はこちら

について学習を続けるには AWS SAM、次のリソースを参照してください。

  • 完全な AWS SAM ワークショップ — AWS SAM が提供する主要な機能の多くを学習するために設計されたワークショップ。

  • SAM を使用したセッション — を使用して で Serverless Developer Advocate チームによって AWS 作成された動画シリーズ AWS SAM。

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

次のステップ

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