メニュー
AWS Lambda
開発者ガイド

Lambda ベースのアプリケーションをデプロイする

Lambda ベースのアプリケーション (サーバーレスアプリケーション とも呼ばれる) は各イベントによってトリガーされる関数で構成されます。典型的なサーバーレスアプリケーションは、Amazon S3、Amazon SNS 通知、および API アクションへのオブジェクトのアップロードなどのイベントによってトリガーされる 1 つ以上の関数で構成されます。これらの関数はスタンドアローンとなるか、DynamoDB テーブルや Amazon S3 バケットなどの他のリソースを活用することができます。基本的なサーバーレスアプリケーションのほとんどは単一の関数です。

AWS Lambda は、デプロイメントパッケージを ZIP ファイルとして提供することによって Lambda 関数を作成および更新するために使用できる API オペレーションを提供します。ただし、このメカニズムは、関数のデプロイステップの自動化や、イベントソースやダウンストリームリソースなどのサーバーレス アプリケーションの他の要素に対するデプロイメントや更新を調整するには便利ではない場合があります。例えば、Amazon SNS トリガーをデプロイするには、関数、Amazon SNS トピック、関数とトピックの間のマッピング、および DynamoDB テーブルなどの、関数が必要とするその他のダウンストリームリソースを更新する必要があります。

AWS CloudFormation を使用してサーバーレスアプリケーションをデプロイする

AWS CloudFormation を使用することで、サーバーレスアプリケーションの指定、デプロイ、設定が容易になります。AWS CloudFormation は AWS リソースのモデル化およびセットアップに役立つサービスです。リソース管理に割く時間を減らし、AWS; で実行するアプリケーションにより注力できるようになります。使用するすべての AWS リソース (Lambda 関数や DynamoDB テーブルなど) を記述するテンプレートを作成すれば、AWS CloudFormation がお客さまに代わってこれらのリソースのプロビジョニングや設定を受け持ちます。AWS リソースを個別に作成、設計して、それぞれの依存関係を考える必要はありません。 —AWS CloudFormation がすべてを処理します。詳細については、『AWS CloudFormation ユーザーガイド』の「AWS CloudFormation Concepts」を参照してください。

AWS サーバーレスアプリケーションモデル (AWS SAM) の使用

AWS サーバーレスアプリケーションモデル (AWS SAM) はサーバーレスアプリケーションを定義するモデルです。AWS SAM は、AWS CloudFormation によりネイティブにサポートされ、サーバーレスリソースを表すための簡易構文を定義します。現在の仕様では、API、Lambda 関数、Amazon DynamoDB テーブルを対象としています。この仕様は、AWS パートナーと顧客が独自のツールセット内で採用し、拡張するために Apache 2.0 で利用可能となっています。詳細な仕様については、「AWS サーバーレスアプリケーションモデル」を参照してください。

AWS CloudFormation 内のサーバーレスリソース

AWS SAM は、サーバレスアプリケーションの関数、API、マッピング、およびDynamoDB テーブルの表現方法を簡素化する特別なリソースタイプをサポートします。また、環境変数などのこれらのサービスのいくつかの機能もサポートしています。これらのリソースの AWS CloudFormation の記述は、「AWS サーバーレスアプリケーションモデル」に準拠しています。アプリケーションをデプロイするには、必要なリソースを、AWS CloudFormation テンプレートファイル (JSON または YAML で記述された) の関連するアクセス権限ポリシーと共にアプリケーションの一部として指定します。デプロイアーティファクトをパッケージ化し、テンプレートをデプロイします。

AWS SAM モデルに準拠したサーバレスリソースを持つ AWS CloudFormation テンプレートは、SAM ファイルまたはテンプレートと呼ばれます。

以下の例はサーバーレスアプリケーションの一般的なコンポーネントを宣言するために AWS SAM を利用する方法を説明します。Handler および Runtime パラメータ値は、前のセクションで関数を作成したときのものと一致する必要があります。

Lambda 関数

次に、Lambda 関数の表記法を紹介します:

Copy
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: FunctionName: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: runtime CodeUri: s3://bucketName/codepackage.zip

Lambda 関数のコーディングを含むモジュールを指定する Handler プロパティの handler 値は呼び出し時に実行されます。Handler プロパティの index 値は、コードを含むファイルの名前を示します。サーバーレスアプリケーションで必要な数の関数を宣言できます。

また、アプリケーションで設定できる設定に環境変数を宣言できます。次の例では、2 つの Lambda 関数と DynamoDB テーブルを指す環境変数を持つサーバーレスアプリケーションを示しています。 Lambda 関数コードの変更、再パッケージ、または再デプロイする必要なく、環境変数を更新できます。詳細については、「Environment Variables」を参照してください。

Copy
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: PutFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs6.10 Policies: AWSLambdaDynamoDBExecutionRole CodeUri: s3://bucketName/codepackage.zip Environment: Variables: TABLE_NAME: !Ref Table DeleteFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs6.10 Policies: AWSLambdaDynamoDBExecutionRole CodeUri: s3://bucketName/codepackage.zip Environment: Variables: TABLE_NAME: !Ref Table Events: Stream: Type: DynamoDB Properties: Stream: !GetAtt DynamoDBTable.StreamArn BatchSize: 100 StartingPosition: TRIM_HORIZON DynamoDBTable: Type: AWS::DynamoDB::Table Properties: AttributeDefinitions: - AttributeName: id AttributeType: S KeySchema: - AttributeName: id KeyType: HASH ProvisionedThroughput: ReadCapacityUnits: 5 WriteCapacityUnits: 5 StreamSpecification: StreamViewType: streamview type

上記の表記に注意してください:

Copy
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31

これは AWS CloudFormation テンプレート内に AWS サーバーレスアプリケーションモデルによって定義されたオブジェクトを含めるために必要です。

SimpleTable

SimpleTable は単一属性のプライマリキーで DynamoDB テーブルを作成するリソースです。サーバレスアプリケーションがやり取りしているデータに単一値のキーのみでアクセスする必要がある場合は、この簡易版を使用できます。以下で示すように、SimpleTable を使用するために前の例を更新できます:

Copy
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: TableName: Type: AWS::Serverless::SimpleTable Properties: PrimaryKey: Name: id Type: String ProvisionedThroughput: ReadCapacityUnits: 5 WriteCapacityUnits: 5

イベント

イベントは Amazon API Gateway エンドポイントまたは Amazon SNS 通知などの Lambda 関数をトリガーする AWS リソースです。Events プロパティは関数につき複数のイベントを設定できるようにする配列です。次に、DynamoDB テーブル付属の Lambda 関数をイベントソースとして記述する表記法を紹介します:

Copy
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: FunctionName: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs6.10 Events: Stream: Type: DynamoDB Properties: Stream: !GetAtt DynamoDBTable.StreamArn BatchSize: 100 StartingPosition: TRIM_HORIZON TableName: Type: AWS::DynamoDB::Table Properties: AttributeDefinitions: - AttributeName: id AttributeType: S KeySchema: - AttributeName: id KeyType: HASH ProvisionedThroughput: ReadCapacityUnits: 5 WriteCapacityUnits: 5

前述の通り、Lambda 関数をトリガーするイベントソースを複数設定できます。以下の例では、HTTP PUT または POST イベントのいずれかでトリガー可能な Lambda 関数を示します。

API

AWS SAM を使用して API を定義する方法は二つあります。以下では、Swagger を使用して基礎となる Amazon API Gateway リソースを設定します。

Copy
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: Api: Type: AWS::Serverless::Api Properties: StageName: prod DefinitionUri: swagger.yml

次の例では、AWS::Serverless::Api リソースタイプは、AWS::Serverless::Function リソースで定義された API イベントの組み合わせから暗黙的に追加されます。

Copy
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: GetFunction: Type: AWS::Serverless::Function Properties: Handler: index.get Runtime: nodejs6.10 CodeUri: s3://bucket/api_backend.zip Policies: AmazonDynamoDBReadOnlyAccess Environment: Variables: TABLE_NAME: !Ref Table Events: GetResource: Type: Api Properties: Path: /resource/{resourceId} Method: get PutFunction: Type: AWS::Serverless::Function Properties: Handler: index.put Runtime: nodejs6.10 CodeUri: s3://bucket/api_backend.zip Policies: AmazonDynamoDBFullAccess Environment: Variables: TABLE_NAME: !Ref Table Events: PutResource: Type: Api Properties: Path: /resource/{resourceId} Method: put DeleteFunction: Type: AWS::Serverless::Function Properties: Handler: index.delete Runtime: nodejs6.10 CodeUri: s3://bucket/api_backend.zip Policies: AmazonDynamoDBFullAccess Environment: Variables: TABLE_NAME: !Ref Table Events: DeleteResource: Type: Api Properties: Path: /resource/{resourceId} Method: delete Table: Type: AWS::Serverless::SimpleTable

上記の例では、AWS CloudFormation が Amazon API Gateway API を、"/resource/{resourceId}" パス、および GETPUTDELETE メソッドで作成します。

アクセス許可

以下に示すように、この関数の実行ロールとして使用する AWS Identity and Access Management (IAM) ロールに、Amazon リソースネーム (ARN) を指定できます。

Copy
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: FunctionName: Type: AWS::Serverless::Function Properties: Role:role arn

また、Lambda 関数リソースに一つ以上のフルマネージドログ管理ポリシーを指定できます。AWS CloudFormation は、管理ポリシーにデフォルトの Lambda ベーシック実行ポリシーを加えた新しいロールを作成します。

Copy
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: FunctionName: Type: AWS::Serverless::Function Properties: Policies: AmazonDynamoDBFullAccess

これらのいずれも指定しない場合、デフォルト実行ロールは Lambda ベーシック実行権限で作成されます。

注記

サーバーレスリソースを使用するほかに、従来の AWS CloudFormation 構文を使用しても同じテンプレートでリソースを表現できます。現在の SAM モデルに含まれないリソースでも、AWS CloudFormation 構文を使って AWS CloudFormation テンプレートで作成できます。さらに、AWS CloudFormation 構文を使用して、SAM モデルを使用する代わりにサーバーレスリソースを表現することもできます。従来の CloudFormation 構文を使用して SAM テンプレートの一部として Lambda 関数を指定する方法については、『AWS CloudFormation ユーザーガイド』の「AWS::Lambda::Function」を参照してください。

完全なサーバーレスアプリケーション例のリストは「AWS Lambda の使用方法の例」を参照してください。

次のステップ

独自のサーバーレスアプリケーションを作成する