web-dev-qa-db-ja.com

Cognitoユーザープールオーソライザーを使用したAWSSAM API

Cognito User Pools承認者を使用して承認を行う AWS SAM でAPIを作成するにはどうすればよいですか?

そこに AWS :: ApiGateway :: Authorizer 。だが ...

{
  "Type" : "AWS::ApiGateway::Authorizer",
  "Properties" : {
    "AuthorizerCredentials" : String,
    "AuthorizerResultTtlInSeconds" : Integer,
    "AuthorizerUri" : String,
    "IdentitySource" : String,
    "IdentityValidationExpression" : String,
    "Name" : String,
    "ProviderARNs" : [ String, ... ],
    "RestApiId" : String,
    "Type" : String
  }
}

RestApiId はこの承認者を使用するAPIを参照しているように見えますか?しかし、AWS SAMでは、私のAPIは次のように定義されています

Resources:
  Ec2Index:
    Type: AWS::Serverless::Function
    Properties:
      Handler: ec2/index.handler
      Runtime: nodejs6.10
      CodeUri: ./src
      FunctionName: 'ApiEc2IndexHandler'
      Description: 'List EC2 resources'
      Timeout: 30
      Role: 'arn:aws:iam::598545985414:role/awsmanagement-lambda-management'
      Events:
        Ec2Index:
          Type: Api
          Properties:
            Path: /ec2
            Method: get

それらをどのように関連付けるのかわかりませんか?

13
Jiew Meng

SAMで承認者を指定できるかどうかはわかりませんが、これを実行できるSAMファイルにSwaggerを埋め込むことができます。 2月17日現在の新機能です[ ref ]。

私は間違いなくSwaggerやSAMの専門家ではありませんが、次のようなものが必要なようです。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Simple API Endpoint configured using Swagger specified inline and backed by a Lambda function
Resources:
   Ec2Index:
     Type: AWS::Serverless::Api
    Properties:
        StageName: <stage>
        DefinitionBody:
            swagger: 2.0
            info:
              title:
                Ref: AWS::StackName
            securityDefinitions:
              cognitoUserPool:
                type: apiKey,
                name: "Authorization"
                in: header
                x-Amazon-apigateway-authtype: cognito_user_pools
                x-Amazon-apigateway-authorizer:
                  type: cognito_user_pools
                  providerARNs:
                    - arn:aws:cognito-idp:${AWS::Region}:{AWS::AccountId}:userpool/<user_pool_id>
            paths:
              "/ec2":
                get:
                  security:
                    - cognitoUserPool: []
                  x-Amazon-apigateway-integration:
                    httpMethod: POST
                    type: aws_proxy
                    uri:
                      Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${Ec2IndexLamb.Arn}/invocations
                  responses: {}
            swagger: '2.0'
   Ec2IndexLamb:
    Type: AWS::Serverless::Function
    Properties:
      Handler: ec2/index.handler
      Runtime: nodejs6.10
      CodeUri: ./src
      FunctionName: 'ApiEc2IndexHandler'
      Description: 'List EC2 resources'
      Timeout: 30
      Role: 'arn:aws:iam::598545985414:role/awsmanagement-lambda-management'
      Events:
        Ec2Index:
          Type: Api
          Properties:
            Path: /ec2
            Method: get

参照:

https://docs.aws.Amazon.com/apigateway/latest/developerguide/apigateway-integrate-with-cognito.html#apigateway-enable-cognito-user-pool

https://github.com/awslabs/serverless-application-model/blob/master/examples/2016-10-31/inline_swagger/template.yaml


編集:「セキュリティ」セクションのSwagger2.0構文を修正しました。リストにする必要があります。

3
John Jones

'ServerlessRestApi'を使用して暗黙的に作成されたAPIゲートウェイを参照できるようになりました。したがって、SAMテンプレートにこの通常のCloudformationを追加すると、すべてが正常に機能します。

ApiCognitoAuthorizer:          
  Type: AWS::ApiGateway::Authorizer
  Properties:
    IdentitySource: 'method.request.header.Authorization'
    Name: ApiCognitoAuthorizer
    ProviderARNs:
      - 'arn:aws:cognito-idp:{region}:{userpoolIdentifier}'
    RestApiId: !Ref ServerlessRestApi
    Type: COGNITO_USER_POOLS
3
simones

Cognito UserAuthorizerをSAMAWS::Serverless::Apiに直接追加できます。

  MyApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: Prod
      Cors: "'*'"
      Auth:
        DefaultAuthorizer: MyCognitoAuthorizer
        Authorizers:
          MyCognitoAuthorizer:
            UserPoolArn: 'arn:aws:cognito-.....' # YOUR COGNITO USER POOL ARN

また、AWS::Serverless::Functionで、デフォルトの承認者を設定していない場合は、関数承認者を追加できます。または、Authorizer: 'NONE'を使用して非アクティブ化できます。

Auth:
  Authorizer: MyCognitoAuthorizer

ドキュメント も参照してください。

1
H6.

AWS SAM v1.8.0以降、次の構文を使用して実行できます。詳細については、 この記事 を参照してください。

つまり、 API Authorizer Object を使用して、APIのCognitoAuthorizerを定義します。次に、ラムダ関数のAuthをこのAPIを参照するように設定します。

MyApi:
  Type: AWS::Serverless::Api
  Properties:
    StageName: Prod
    Auth:
      DefaultAuthorizer: MyCognitoAuth # OPTIONAL
      Authorizers:
        MyCognitoAuth:
          # Can also accept an array
          UserPoolArn: !GetAtt MyCognitoUserPool.Arn 
          Identity: # OPTIONAL
            # OPTIONAL; Default: 'Authorization'
            Header: MyAuthorizationHeader 
            # OPTIONAL
            ValidationExpression: myAuthValidationExp
MyFunction:
  Type: AWS::Serverless::Function
  Properties:
    FunctionName: MyFunction
    ...
    Events:
      Post:
        Type: Api
        Properties:
          Path: /compute
          Method: POST
          RestApiId: !Ref MyApi
          Auth:
            Authorizer: MyCognitoAuth
1
Jun711

@simonesが述べたように、以下はCognitoユーザープールオーソライザー(CFテンプレート)を作成します。

ApiCognitoAuthorizer:          
 Type: AWS::ApiGateway::Authorizer
 Properties:
  IdentitySource: 'method.request.header.Authorization'
  Name: ApiCognitoAuthorizer
  ProviderARNs:
   - 'arn:aws:cognito-idp:{region}:{userpoolIdentifier}'
  RestApiId: !Ref ServerlessRestApi
  Type: COGNITO_USER_POOLS

これをリソースメソッドにアタッチするには、次のように機能します(Swaggerファイル内)。

 securityDefinitions:
  ApiCognitoAuthorizer:
    type: apiKey
    name: Authorization
    in: header
    x-Amazon-apigateway-authtype: cognito_user_pools
    x-Amazon-apigateway-authorizer:
      type: cognito_user_pools
      providerARNs:
        - arn:aws:cognito-idp:{region}:{userpoolIdentifier}

次に、特定のメソッドに追加します(Swaggerファイル内)。

    security:
    - ApiCognitoAuthorizer: []
0
Matthew Pitts