如何使用Terraform创建AWS Cognito用户

12

我想使用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实现它的想法?

4个回答

7
为了自动化操作,可以使用 Terraform 中的 null_resourcelocal_exec 配合执行 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"
  }
}

1
你的解决方案被提及为一种变通方法: https://github.com/terraform-providers/terraform-provider-aws/issues/4542 - confiq

4

4

目前在Terraform中直接创建用户池中的用户是不可能的,因为没有一个资源可以创建用户。

有一个正在处理的问题请求该功能,但尚未开始工作。


3

由于 Terraform 无法直接实现这一点,与 matusko 解决方案相反,我建议使用 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
}

来源

示例 基于以下技术的简单项目:

  • Terraform,
  • Cognito,
  • Elastic Load Balancer,
  • Auto Scaling Group,
  • Spring Boot 应用程序
  • PostgreSQL 数据库。

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

Terraform 项目和简单应用程序:

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


这里的var.COGNITO_USERS_MAIL是什么?一个单独的用户?还是一组用户? - Karl
我认为我给它命名错误了,这应该只是一个用户邮件。这是密码将被发送的邮件。我做了很长时间,但如果我记得正确,terraform变量类型“string”不允许数组。我计划从纯terraform迁移到terragrunt,所以我会把这个拼写加入待办事项列表。 - Łukasz Kotyński
好的。我已经检查过了。这是使用Terraform堆栈创建的所有用户的一个邮件。两个用户共用一个邮件 ;) - Łukasz Kotyński
如果您仍然感兴趣 - 已经完成了迁移到Terragrunt。现在运行项目应该更加简单。 - Łukasz Kotyński

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接