メモ: SAM でAPIGateway のAuthorizer にAWS_IAM を簡単に指定できるようになっていた

結構前にアップデートがあったようですが、放置していました。

https://aws.amazon.com/jp/about-aws/whats-new/2019/aws_serverless_application_Model_support_IAM/

以前、SAM でAPIGatewayの認可をIAMにするように設定する場合、シンプルに”AWS_IAM” を指定すれば良くなっていました。昔はこの指定がサポートされておらず、別途、Open API の形式で定義したものをSAM にロードするような設定が必要でした。

IAMを指定するだけのために、以下のようなOpenAPI の形式で定義したAPIをSAM で指定します。

openapi: "3.0.1"
info:
  title: "sam-simple-greeting-api"
  version: "1.0"
servers:
  variables:
    basePath:
      default: "/prod"
paths:
  /hello/{lang}:
    get:
      security:
      - sigv4: []
      x-amazon-apigateway-integration:
        uri: "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${MyGreetingDynamoDBGetFunction.Arn}/invocations"
        passthroughBehavior: "when_no_match"
        httpMethod: "POST"
        type: "aws_proxy"
    put:
      security:
      - sigv4: []
      x-amazon-apigateway-integration:
        uri: "Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${MyGreetingDynamoDBPutFunction.Arn}/invocations"
        passthroughBehavior: "when_no_match"
        httpMethod: "POST"
        type: "aws_proxy"
    options:
      responses:
        200:
          description: "200 response"
          headers:
            Access-Control-Allow-Origin:
              schema:
                type: "string"
            Access-Control-Allow-Methods:
              schema:
                type: "string"
          content: {}
      x-amazon-apigateway-integration:
        responses:
          default:
            statusCode: "200"
            responseParameters:
              method.response.header.Access-Control-Allow-Methods: "'GET,OPTIONS,PUT'"
              method.response.header.Access-Control-Allow-Origin: "'*'"
            responseTemplates:
              application/json: "{}\n"
        passthroughBehavior: "when_no_match"
        requestTemplates:
          application/json: "{\n  \"statusCode\" : 200\n}\n"
        type: "mock"
components:
  securitySchemes:
    sigv4:
      type: "apiKey"
      name: "Authorization"
      in: "header"
      x-amazon-apigateway-authtype: "awsSigv4"

上記のopenapi.yaml をSAM で指定します。

  GreetingApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: 'prod'
      DefinitionBody:
        Fn::Transform:
          Name: AWS::Include
          Parameters:
            Location: !Sub 's3://${DeployBucketName}/openapi.yaml'

上記openapi.yaml を参照するのに、予めS3 バケットに登録しておかなかれば行けないなどなかなか面倒な設定でした。

このように非常に面倒だったので、とてもハマり苦労した経験があります。

現在は、非常にシンプルで以下のように、DefaultAuthorize に”AWS_IAM”の指定を書けばよいだけです。

GreetingApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: 'prod'
      Auth:
        DefaultAuthorizer: AWS_IAM

非常にシンプルにですね!

ドキュメントは以下を参照してください。

https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api-auth-object