【问题标题】:How to create a AWS Cognito user with Terraform如何使用 Terraform 创建 AWS Cognito 用户
【发布时间】:2019-07-31 22:22:34
【问题描述】:

我想使用 Terraform 创建 AWS Cognito 用户池 一个测试用户。创建用户池非常简单:

resource "aws_cognito_user_pool" "users" {
  name = "${var.cognito_user_pool_name}"
  admin_create_user_config {
    allow_admin_create_user_only = true
    unused_account_validity_days = 7
  }
}

但是,我找不到创建 AWS Cognito 用户的资源。 AWS Cli 是可行的

aws cognito-idp admin-create-user --user-pool-id <value> --username <value>

知道如何使用 Terraform 来实现吗?

【问题讨论】:

    标签: amazon-cognito terraform terraform-provider-aws


    【解决方案1】:

    为了使事情自动化,可以使用 null_resourcelocal_exec 配置器在 terraform 中执行您的 aws cli 命令

    例如

    resource "aws_cognito_user_pool" "pool" {
      name = "mypool"
    }
    
    resource "null_resource" "cognito_user" {
    
      triggers = {
        user_pool_id = aws_cognito_user_pool.pool.id
      }
    
      provisioner "local-exec" {
        command = "aws cognito-idp admin-create-user --user-pool-id ${aws_cognito_user_pool.pool.id} --username myuser"
      }
    }
    

    【讨论】:

    【解决方案2】:

    目前无法直接在 Terraform 中执行此操作,因为没有在用户池中创建用户的资源。

    有一个open issue 请求该功能,但尚未开始任何工作。

    【讨论】:

      【解决方案3】:

      由于与 matusko 解决方案相反,无法直接通过 Terraform 执行此操作,因此我建议使用 CloudFormation 模板。

      在我看来它更优雅,因为:

      • 它不需要在本地安装其他应用程序
      • 它可以由 terraform 管理,因为 CF 堆栈可以由 terraform 销毁

      使用模板的简单解决方案如下所示。请记住,我跳过了与provider 等不直接相关的文件和资源。示例还包含将用户加入群组。

      variables.tf

      variable "COGITO_USERS_MAIL" {
        type = string
        description = "On this mail passwords for example users will be sent. It is only method I know for receiving password after automatic user creation."
      }
      

      cf_template.json

      {
        "Resources" : {
          "userFoo": {
            "Type" : "AWS::Cognito::UserPoolUser",
            "Properties" : {
              "UserAttributes" : [
                { "Name": "email", "Value": "${users_mail}"}
              ],
              "Username" : "foo",
              "UserPoolId" : "${user_pool_id}"
            }
          },
          "groupFooAdmin": {
            "Type" : "AWS::Cognito::UserPoolUserToGroupAttachment",
            "Properties" : {
              "GroupName" : "${user_pool_group_admin}",
              "Username" : "foo",
              "UserPoolId" : "${user_pool_id}"
            },
            "DependsOn" : "userFoo"
          }
        }
      }
      

      cognito.tf

      resource "aws_cognito_user_pool" "user_pool" {
        name = "cogito-user-pool-name"
      }
      
      resource "aws_cognito_user_pool_domain" "user_pool_domain" {
        domain       = "somedomain"
        user_pool_id = aws_cognito_user_pool.user_pool.id
      }
      
      resource "aws_cognito_user_group" "admin" {
        name         = "admin"
        user_pool_id = aws_cognito_user_pool.user_pool.id
      }
      

      user_init.tf

      data "template_file" "application_bootstrap" {
        template = file("${path.module}/cf_template.json")
      
        vars = {
          user_pool_id          = aws_cognito_user_pool.user_pool.id
          users_mail            = var.COGNITO_USERS_MAIL
          user_pool_group_admin = aws_cognito_user_group.admin.name
        }
      }
      
      resource "aws_cloudformation_stack" "test_users" {
        name = "${var.TAG_PROJECT}-test-users"
      
        template_body = data.template_file.application_bootstrap.rendered
      }
      

      来源

      示例 简单项目基于:

      • 地形,
      • 认知,
      • 弹性负载均衡器,
      • Auto Scaling 组,
      • Spring Boot 应用程序
      • PostgreSQL 数据库。

      在 ELB 和 Spring Boot 上进行安全检查。 这意味着 ELB 不能将未经授权的用户传递给应用程序。并且应用程序可以基于映射到 Cognito 角色的 PostgreSQL 角色做进一步的安全检查。

      Terraform 项目和简单应用:

      有关如何在 terraform git 存储库的 README.MD 中运行它的更多信息。

      【讨论】:

      • 这里的 var.COGNITO_USERS_MAIL 是什么?单个用户?用户列表?
      • 我想我把它命名错了,这应该只是一个用户邮件。这是将发送密码的邮件。我很久以前就做过了,但是如果我没记错的话,terraform 变量类型string 将不允许使用数组。我打算从纯 terraform 转移到 terragrunt,所以我会将此拼写添加到待办事项列表中。
      • 好的。我已经检查过了。对于使用此 terraform 堆栈创建的所有用户,这是一封邮件。两个用户一封邮件;)
      • 如果您仍然感兴趣 - 迁移到 terragrunt 已经完成。现在运行项目应该会简单得多。
      猜你喜欢
      • 2022-01-13
      • 2020-09-11
      • 2017-04-23
      • 2020-05-13
      • 2021-09-04
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      相关资源
      最近更新 更多