Как передать Cognito UserPoolID, секрет клиента в AWS Lambda во время выполнения скрипта Cloudformation? - PullRequest
0 голосов
/ 07 августа 2020

Я создаю сценарий Cloudformation, который создает AWS Cognito и развертывает набор AWS Lambda. Облачный yaml выглядит так:

  UserPool:
    Type: "AWS::Cognito::UserPool"
    Properties:
      UserPoolName:  !Sub ${EnvPrefix}-smartshoesuserpool
      Policies:
        PasswordPolicy:
          MinimumLength: 8
          RequireUppercase: true
          RequireLowercase: true
          RequireNumbers: true
          RequireSymbols: true
          TemporaryPasswordValidityDays: 7
      AutoVerifiedAttributes:
        - email
      AliasAttributes:
        - email
      EmailVerificationMessage: 'Your verification code is {####}. '
      EmailVerificationSubject: Your verification code
      VerificationMessageTemplate:
        EmailMessage: 'Your verification code is {####}. '
        EmailSubject: Your verification code
        DefaultEmailOption: CONFIRM_WITH_CODE
      MfaConfiguration: 'OFF'
      EmailConfiguration:
        EmailSendingAccount: COGNITO_DEFAULT
      AdminCreateUserConfig:
        AllowAdminCreateUserOnly: false
        InviteMessageTemplate:
          SMSMessage: 'Your username is {username} and temporary password is {####}. '
          EmailMessage: 'Your username is {username} and temporary password is {####}. '
          EmailSubject: Your temporary password
      UsernameConfiguration:
        CaseSensitive: false
      AccountRecoverySetting:
        RecoveryMechanisms:
        - Priority: 1
          Name: verified_email
        - Priority: 2
          Name: verified_phone_number
      UserPoolTags:
        Creator: !Ref CreatorUsername
        Environment:  !Ref EnvPrefix
      
  # User Pool client  
  # eksport z uzyciem: aws cognito-idp describe-user-pool-client --user-pool-id eu-central-1_E5ZQHWb1N --client-id 7oasfnq1cld9sh4jajjap2g80p
  UserPoolClient:
    Type: "AWS::Cognito::UserPoolClient"
    Properties:
      UserPoolId: !Ref UserPool
      ClientName: !Sub ${EnvPrefix}-smartshoesuserpoolclient
      RefreshTokenValidity: 30
      ReadAttributes:
      - email
      - email_verified
      WriteAttributes:
      - email
      ExplicitAuthFlows:
      - ALLOW_ADMIN_USER_PASSWORD_AUTH
      - ALLOW_CUSTOM_AUTH
      - ALLOW_REFRESH_TOKEN_AUTH
      - ALLOW_USER_PASSWORD_AUTH
      - ALLOW_USER_SRP_AUTH
      AllowedOAuthFlowsUserPoolClient: false
      PreventUserExistenceErrors: ENABLED

Просто создайте UserPool и UserPoolClient. Но у меня проблема, потому что в функции Lambda я должен знать UserPoolId, UserClientId и ClientSecret, и я не нашел метода для получения этих значений внутри yaml Clorudformation. Я могу написать короткую программу Python, используя Boto3, которая ищет UserPool и другие значения, но я не могу выполнить ее внутри yaml. Как получить эти параметры и «внедрить» в лямбда-функцию на этапе развертывания?

.....
def initiate_auth(client, username, password):
  secret_hash = get_secret_hash(username)
    try:
      resp = client.admin_initiate_auth(
                 UserPoolId=USER_POOL_ID,
                 ClientId=CLIENT_ID,
                 AuthFlow='ADMIN_NO_SRP_AUTH',
                 AuthParameters={
                     'USERNAME': username,
                     'SECRET_HASH': secret_hash,
                     'PASSWORD': password,
                  },
                ClientMetadata={
                  'username': username,
                  'password': password,
              })
....

1 Ответ

0 голосов
/ 07 августа 2020

Я могу написать короткую Python программу, используя Boto3, которая ищет UserPool и другие значения, но я не могу выполнить ее внутри yaml

Вы можете рассмотреть возможность разработки пользовательского ресурса в CloudFormation. Ресурс будет лямбда-функцией , которая может выполнить ваш python скрипт и вернуть любые необходимые значения в другие ресурсы вашего шаблона.

Однако, если вы также создадите свои лямбда-функции в В том же шаблоне вы можете передать идентификаторы, используя свойство Environment функции:

Переменные среды, доступные из кода функции во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...