AWS Lambda
開発者ガイド

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

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

AWS SAM を使用するサーバーレスリソース

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

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

Lambda 関数

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

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」を参照してください。

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 DynamoDBTable DeleteFunction: Type: AWS::Serverless::Function Properties: Handler: index.handler Runtime: nodejs6.10 Policies: AWSLambdaDynamoDBExecutionRole CodeUri: s3://bucketName/codepackage.zip Environment: Variables: TABLE_NAME: !Ref DynamoDBTable 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

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

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

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

SimpleTable

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

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 関数をイベントソースとして記述する表記法を紹介します:

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 リソースを設定します。

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 イベントの組み合わせから暗黙的に追加されます。

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) を指定できます。

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

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

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 の使用方法の例」を参照してください。

Simple App (sam init) の作成

SAM でプロジェクトを開始するには、SAM CLI によって提供される sam init コマンドを使用して、サポートされているランタイムを選択し、完全にデプロイ可能な、共通のサーバーレスアプリケーションを取得します。sam init は SAM CLI の他のコマンドを使用して、Lambda ベースのアプリケーションの作成を開始し、本稼働アプリケーションを拡張するための迅速な方法を提供します。

sam init を使用するには、サーバーレスアプリケーションを作成するディレクトリに移動します。SAM CLI を使用して、次のコマンドを実行します (任意のランタイムを使用します。次の例では、デモンストレーションの目的で Python を使用します)。

$ sam init --runtime python [+] Initializing project structure... [SUCCESS] - Read sam-app/README.md for further instructions on how to proceed [*] Project initialization is now complete

これにより、現在のディレクトリに、sam-app というタイトルのフォルダが作成されます。このフォルダには、関数コードファイルと SAM アプリケーションを続行する方法の詳細なガイダンスを提供する README ファイルとともに、AWS SAM テンプレートが含まれます。SAM テンプレートは、アプリケーションが AWS クラウドで実行する必要がある AWS リソースを定義します。

このフォルダ構造には、次のものが含まれます。

  • サンプルコードを含む app.py ファイルを含む hello_world ディレクトリ。

    import json import requests def lambda_handler(event, context): """Sample pure Lambda function Arguments: event LambdaEvent -- Lambda Event received from Invoke API context LambdaContext -- Lambda Context runtime methods and attributes Returns: dict -- {'statusCode': int, 'body': dict} """ ip = requests.get('http://checkip.amazonaws.com/') return { "statusCode": 200, "body": json.dumps({ 'message': 'hello world', 'location': ip.text.replace('\n', ''), }) }
  • SAM アプリケーションを記述するサンプルの template YAML ファイル。

    AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: > sam-app Sample SAM Template for sam-app # More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst Globals: Function: Timeout: 3 Resources: HelloWorldFunction: Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Properties: CodeUri: hello_world/build/ Handler: app.lambda_handler Runtime: python2.7 Environment: # More info about Env Vars: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#environment-object Variables: PARAM1: VALUE Events: HelloWorld: Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api Properties: Path: /hello Method: get Outputs: HelloWorldApi: Description: "API Gateway endpoint URL for Prod stage for Hello World function" Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/" HelloWorldFunction: Description: "Hello World Lambda Function ARN" Value: !GetAtt HelloWorldFunction.Arn HelloWorldFunctionIamRole: Description: "Implicit IAM Role created for Hello World function" Value: !GetAtt HelloWorldFunctionRole.Arn

次のステップ

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