无法通过cloudformation设置认知用户池客户端的属性

问题描述 投票:4回答:4

我正在尝试通过cloudformation运行congnito,并且一切正常,但是cognito中的部分如下:

enter image description here

如您所见,存在“启用身份提供者”部分而且我找不到在Cloudformation中可以将其设置为我的Cognito用户池的地方!

我尝试了此属性,但它说不支持。

SupportedIdentityProviders

这是我的用户池客户端代码:

  UserPoolClient:
Type: "AWS::Cognito::UserPoolClient"
Properties:
  ClientName: !Sub ${project}-client
  ExplicitAuthFlows:
   - ADMIN_NO_SRP_AUTH
   - USER_PASSWORD_AUTH
  GenerateSecret: false
  UserPoolId: !Ref UserPool
  RefreshTokenValidity: 30

这是我的用户池:

  UserPool:
Type: "AWS::Cognito::UserPool"
Properties:
  UserPoolName: !Sub ${project}-user-pool-test
  AutoVerifiedAttributes:
    - email
  UsernameAttributes:
    - email
  MfaConfiguration: "OFF"
  LambdaConfig:
    CustomMessage:
      Fn::ImportValue: !Sub ${project}-${EnvironmentApp}-lambda-cognito-custom-message-post
  Policies:
    PasswordPolicy:
      MinimumLength: !Ref MinimumLength
      RequireLowercase: !Ref RequireLowercase
      RequireNumbers: !Ref RequireNumbers
      RequireSymbols: !Ref RequireSymbols
      RequireUppercase: !Ref RequireUppercase
  Schema:
    -
        AttributeDataType: String
        DeveloperOnlyAttribute: false
        Mutable: true
        Name: !Sub ${project}-stg
        Required: false
    -
        AttributeDataType: String
        DeveloperOnlyAttribute: false
        Mutable: true
        Name: !Sub zuora-stg
        Required: false
    -
        AttributeDataType: String
        DeveloperOnlyAttribute: false
        Mutable: true
        Name: !Sub salesforce-stg
        Required: false

云形成支持吗?感谢您的帮助吗?

amazon-web-services amazon-cloudformation amazon-cognito aws-opsworks
4个回答
2
投票

正如其他答案所暗示的那样,到目前为止,这还不能在CloudFormation中本地完成。但是,正如ASR回答所建议的,可以通过CloudFormation自定义资源来这样做。

我的雇主已开放其自定义资源集合,包括CognitoUserPoolCognitoDomainName(CloudFormation中也不支持)。定制资源源代码can be found on github

下面是进行设置的手动说明-您始终可以通过将自定义资源支持Lambda放在CloudFormation中来进一步自动进行操作。

以下所有命令均适用于Mac。您可能需要修改其他的base64标志平台

1。为Lambda创建IAM角色

aws iam create-role --role-name LambdaRoleCognito --assume-role-policy-document '{
      "Version": "2012-10-17",
      "Statement": [
      {
          "Effect": "Allow",
          "Principal": {
              "Service": "lambda.amazonaws.com"
          },
          "Action": "sts:AssumeRole"
      }
  ]
  }'
aws iam attach-role-policy --role-name LambdaRoleCognito \
  --policy-arn  arn:aws:iam::aws:policy/CloudWatchLogsFullAccess

aws iam attach-role-policy --role-name LambdaRoleCognito \
  --policy-arn  arn:aws:iam::aws:policy/AmazonCognitoPowerUser

2。下载lambda源代码,上传到本地存储桶,然后创建lambda

wget https://github.com/base2Services/cloudformation-custom-resources-nodejs/releases/download/1.0.0/ccr-nodejs-1.0.0.zip
account_id=$(aws sts get-caller-identity --query Account --output text)
aws s3 mb s3://${account_id}.cfncustomres.source
aws s3 cp ccr-nodejs-1.0.0.zip s3://${account_id}.cfncustomres.source/ccr-nodejs-1.0.0.zip

aws lambda create-function --function-name CfnCrCognitUPC --runtime nodejs6.10 \
    --role arn:aws:iam::${account_id}:role/LambdaRoleCognito  \
    --timeout 30 \
    --memory-size 512 \
    --code S3Bucket=${account_id}.cfncustomres.source,S3Key=ccr-nodejs-1.0.0.zip \
    --handler cognito-user-pool-client/index.handler

3。 可选通过调用测试有效负载来测试lambda

aws lambda invoke --function-name CfnCrCognitUPC --payload '{
  "StackId": "arn:aws:cloudformation:us-west-2:EXAMPLE/stack-name/guid",
  "ResponseURL": "http://pre-signed-S3-url-for-response",
  "ResourceProperties": {
    "ClientName": "MyCCRCreatedUP",
    "SupportedIdentityProviders": [
      "COGNITO"
    ],
    "UserPoolId":"!! REPLACE WITH YOUR USER POOL ID !!"
  },
  "RequestType": "Create",
  "ResourceType": "Custom::TestResource",
  "RequestId": "unique id for this create request",
  "LogicalResourceId": "MyTestResource"
}' --log-type Tail --invocation-type RequestResponse output.txt --query LogResult --output text | base64 -D

4。在CloudFormation模板中创建自定义资源

有关所有支持的属性的清单,请参见custom resource JSON schema

Resources:
  MyPoolApplication:
    Type: Custom::CognitoUserPool
    Properties:
      ServiceToken: arn:aws:lambda:<<REPLACE_WITH_YOUR_REGION>>:<<REPLACE_WITH_YOUR_ACCOUNT_ID>>:function:CfnCrCognitUPC
      ClientName: ApplicationClientNameHere
      UserPoolId: 
        Ref: UserPool
      SupportedIdentityProviders:
        - COGNITO
      .... other support properties .... 

1
投票

我上个月遇到了同样的问题。 CFN尚不支持此属性。因此,我最终使用CFN自定义资源来创建池客户端。有关CFN Custom Resource的更多信息。本质上,我让CFN调用Lambda函数来创建用户池客户端(SDK支持所有属性)。


1
投票

正如ASR所说,Cloudformation似乎尚不支持此功能。

我们最终尝试了Terraform-例如,它确实支持它。>

resource "aws_cognito_user_pool_client" "my_client" {
  ...
  supported_identity_providers = ["COGNITO"]
}

我们现在已将所有内容切换为使用terraform,因为它比Cloudformation易于理解,读取和编写数量级。

我知道这可能不是您想要的答案,但希望对您有所帮助。


0
投票

October 2019起,云形式现在支持认知资源。使用预期类型的​​AWS :: Cognito :: UserPool,AWS :: Cognito :: UserPoolClient,AWS :: Cognito :: UserPoolDomain等创建资源。

© www.soinside.com 2019 - 2024. All rights reserved.