4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-06-21

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ドキュメント

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?