ちょっと話題の記事

API Gateway + Lambda のCloudFormationテンプレート

2018.07.23

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

渡辺です。 日本列島が酷暑とのことですが、札幌は23-4℃となっております。

書く機会があったので。 適当に修正してご利用ください。

/Lambda関数名 というリソースを定義し、POSTで対応するLambda関数を呼び出すテンプレートです。

---
AWSTemplateFormatVersion: 2010-09-09
Description: "API Gateway"
Parameters:
  FunctionName:
    Type: String
    Description: "Lambda Function Name (ex: hello-world)"
Resources:
  Api:
    Type: "AWS::ApiGateway::RestApi"
    Properties:
      Name: "api"
  Resource:
    Type: "AWS::ApiGateway::Resource"
    Properties:
      RestApiId: !Ref Api
      ParentId: !GetAtt Api.RootResourceId  
      PathPart: !Sub "${FunctionName}"
  LambdaPermission:
    Type: "AWS::Lambda::Permission"
    Properties:
      FunctionName: !Sub "${FunctionName}"
      Action: "lambda:InvokeFunction"
      Principal: "apigateway.amazonaws.com"
  ResourceMethod:
    Type: "AWS::ApiGateway::Method"
    Properties:
      RestApiId: !Ref Api
      ResourceId: !Ref Resource
      AuthorizationType: "None"
      HttpMethod: "POST"
      Integration:
        Type: "AWS"
        IntegrationHttpMethod: "POST"
        Uri: !Sub "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:${FunctionName}/invocations"
    DependsOn: "LambdaPermission"

Lambda関数はCloudFormationで管理すると面倒なため、適当な方法でデプロイしてください。

ポイントとなるのは、AWS::Lambda::PermissionリソースでLambdaにApiGatewayからの実行権限を付与することと、Integration(統合)でAWSをTypeに指定することです。 IntegrationのTypeがAWS_PROXYの場合、ApiGatewayのヘッダ情報等もLambdaに渡されることになります。 ボディのみに興味がある場合はAWS、ヘッダ情報なども必要な場合はAWS_PROXYで。 管理コンソールでいうところの、「Lambdaプロキシ統合の利用」に相当します。

ググっても、出てくるテンプレートは全部MOCKなんですよ・・・