Как отмечено в другом ответе, жесткое кодирование ARN работает. Таким образом, вы можете подумать, что что-то вроде этого сработает:
authorizer:
arn:
Fn::GetAtt: [UserPool, Arn]
К сожалению, это не так. Похоже, что Без сервера наталкивает ваш arn
на пару регулярных выражений, чтобы определить, указываете ли вы на лямбда или пул пользователей. Этот подход, кажется, не очень хорошо подходит для подходов, использующих такие вещи, как Ref
, Fn::Join
или Fn::GetAtt
По состоянию на Безсерверный 1.27.3 (который был выпущен после того, как был задан этот вопрос), существует своего рода обходной путь .
По сути, вы объявляете свой Authorizer в своем разделе resources
, вместо того, чтобы Serverless автоматически создавал его для вас. Затем вы используете новый ключ authorizerId
в разделе functions
, чтобы указать на этого авторизатора. Минимальный пример:
service: sls-cognitotest
provider:
name: aws
runtime: nodejs6.10
functions:
hello:
handler: handler.hello
events:
- http:
method: any
path: /api/{proxy+}
integration: lambda
authorizer:
type: COGNITO_USER_POOLS
authorizerId: { Ref: MyApiGatewayAuthorizer }
resources:
Resources:
CognitoUserPoolGeneral:
Type: AWS::Cognito::UserPool
Properties:
UserPoolName: general
MyApiGatewayAuthorizer:
Type: AWS::ApiGateway::Authorizer
Properties:
AuthorizerResultTtlInSeconds: 10
IdentitySource: method.request.header.Authorization
Name: MyCognitoAuthorizer
RestApiId:
Ref: ApiGatewayRestApi
Type: COGNITO_USER_POOLS
ProviderARNs:
- {"Fn::Join": ["", ["arn:aws:cognito-idp:", {Ref: "AWS::Region"}, ":", {Ref: "AWS::AccountId"}, ":userpool/", Ref: CognitoUserPoolGeneral]]}
Это не здорово, но это лучше, чем жестко кодировать ARN пула пользователей в свой шаблон.