Help us understand the problem. What is going on with this article?

CloudFormationで定義したAPI GatewayでAuthorizerにCognitoを設定する

More than 1 year has passed since last update.

CloudFormationでAPI Gatewayを定義する

swaggerで定義したり、SAMを使ってスタイリッシュに書いたりする方法があるのでApiGatewayリソースをがっつり書くケースは少ないかもしれない。
しかし、少し凝ったことをしようとすると(それが本当に必要かどうかの議論は置いておくとして)AWS::ApiGateway::XXXというリソース群を大量に定義する必要がある。
ぶっちゃけコンソールでやった方が早

こんなかんじのやつを書く。

Resources:
  RestApi:
    Type: AWS::ApiGateway::RestApi
    Properties:
      Name: !Ref restApiName
  Method:
    Type: AWS::ApiGateway::Method
    Properties:
      HttpMethod: POST
      ResourceId: !GetAtt RestApi.RootResourceId
      RestApiId: !Ref RestApi
      AuthorizationType: NONE
      Integration:
        Type: MOCK
        ContentHandling: !Ref contentHandling
        IntegrationResponses:
          - ContentHandling: !Ref contentHandling
            StatusCode: 400
      RequestValidatorId: !Ref RequestValidator
      OperationName: !Ref operationName
  RequestValidator:
    Type: AWS::ApiGateway::RequestValidator
    Properties:
      Name: !Ref validatorName
      RestApiId: !Ref RestApi
      ValidateRequestBody: !Ref validateRequestBody
      ValidateRequestParameters: !Ref validateRequestParameters

Authorizerを定義したい

CognitoのAuthorizerを下記のように定義する。

Resources:
  RestApi:
    Type: AWS::ApiGateway::RestApi
    Properties:
      Name: !Ref restApiName
  Authorizer: 
    Type: AWS::ApiGateway::Authorizer
    Properties: 
      ProviderARNs: 
        - !GetAtt userPool.Arn
      AuthorizerResultTtlInSeconds: "300"
      Type: "COGNITO_USER_POOLS"
      IdentitySource: "method.request.header.Auth"
      Name: "DefaultAuthorizer"
      RestApiId: 
        Ref: "RestApi"

API GatewayのMethodを定義する

Authorizerを使用するメソッドにAuthorizerIdAuthorizationTypeを定義していく。

AuthorizerId
If you specify this property, specify CUSTOM for the AuthorizationType property.
(このプロパティを指定した場合、CUSTOM プロパティには AuthorizationType を指定します。)

AuthorizationType
If you specify the AuthorizerId property, specify CUSTOM for this property.
(AuthorizerId プロパティを指定した場合、このプロパティには CUSTOM を指定します。)

ドキュメントに記載されている通り、AuthorizerIdに先程設定したAuthorizerをRefで指定、AuthorizationTypeに"CUSTOM"を指定する。

Resources:
  Method:
    Type: AWS::ApiGateway::Method
    Properties:
      HttpMethod: POST
      ResourceId: !GetAtt RestApi.RootResourceId
      RestApiId: !Ref RestApi
      AuthorizerId: !Ref Authorizer
      AuthorizationType: CUSTOM
      Integration:
        Type: MOCK
        ContentHandling: !Ref contentHandling
        IntegrationResponses:
          - ContentHandling: !Ref contentHandling
            StatusCode: 400
      RequestValidatorId: !Ref RequestValidator
      OperationName: !Ref operationName

しかしこれはエラーになるのでビルドされない・・・。

解決: AuthorizationTypeをCOGNITO_USER_POOLSにする

AuthorizerはCognitoなので、AuthorizationTypeも素直にCOGNITO_USER_POOLSにしよう。

Resources:
  Method:
    Type: AWS::ApiGateway::Method
    Properties:
      HttpMethod: POST
      ResourceId: !GetAtt RestApi.RootResourceId
      RestApiId: !Ref RestApi
      AuthorizerId: !Ref Authorizer
      AuthorizationType: COGNITO_USER_POOLS # CUSTOM→ COGNITO_USER_POOLSに変更
      Integration:
        Type: MOCK
        ContentHandling: !Ref contentHandling
        IntegrationResponses:
          - ContentHandling: !Ref contentHandling
            StatusCode: 400
      RequestValidatorId: !Ref RequestValidator
      OperationName: !Ref operationName

これで無事にビルドが通るようになりました!

ドキュメントに一言でいいから書いておいてほしかったな〜〜〜

まぁ、言葉の綾と言えばそうなんですけどね!!!


参考:AWS::ApiGateway::Method ほかAWSドキュメント

mira_cocoa
PHPで生ぬるく生きてきたけど最近PythonとかAWSと懇意にしているIT屋。CloudFormation芸人。最近AWS CDKに手を染めた。家から出たくない会社員。全てが永遠の初心者。光の戦士。満員電車は悪い文明。世界で一番妻が可愛い。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away