使用 Terraform 部署亚马逊 OpenSearch 无服务器

作者: Joshua Lu o 和 Satish Nandi | 2023

Amazon OpenSearch 服务器无服务器 提供 OpenSearch 的搜索和分析功能,无需配置、管理和扩展 OpenSearch 集群的手动开销。它会根据您的工作负载自动扩展资源,您只需为消耗的资源付费。管理 OpenSearch 无服务器很简单,但是有了像 Terraform 这样的基础设施即代码 (IaC) 软件 ,你可以进一步简化资源管理。

这篇文章演示了如何使用 Terraform 创建、部署和清理 OpenSearch 无服务器基础架构。

解决方案概述

要使用 Terraform 创建和部署具有安全和访问策略的 OpenSearch 无服务器集合,您需要执行以下步骤:

  1. 初始化 Terraform 配置。
  2. 创建加密策略。
  3. 创建 OpenSearch 无服务器集合。
  4. 创建网络策略。
  5. 创建虚拟私有云 (VPC) 终端节点。
  6. 创建数据访问策略。
  7. 使用 Terraform 进行部署。

先决条件

这篇文章假设你熟悉 GitHub 和 G it 命令

在本演练中,您需要以下内容:

  • 一个 亚马逊云科技 账户。如果你没有账户,你可以 注册一个
  • 访问具有设置集合 所需 最低权限 的 A WS 身份和访问管理 (IAM) 用户或角色。
  • 您的工作站上安装了 Terraform 0.12 或更高版本。参见 安装 Terraform

初始化 Terraform 配置

示例代码位于 Terraf orm GitHub 存储库的 terraform-provider-aws/examples/opense archserverless 目录中。 此配置将帮助您开始使用 OpenSearch 无服务器。首先,将存储库克隆到您的工作站并导航到该目录:

$ git clone https://github.com/hashicorp/terraform-provider-aws.git && \ 
cd ./terraform-provider-aws/examples/opensearchserverless

通过运行以下命令初始化配置以安装 a w s 提供商:

$ terraform init

Terraform 配置首先定义所需的 Terraform 版本,并将 AWS 提供商 配置为在 aws_re gion 变量定义的区域中启动资源:

# Require Terraform 0.12 or greater
terraform {
  required_version = ">= 0.12"
}

# Set AWS provider region
provider "aws" {
  region = var.aws_region
}

此 Terraform 配置中使用的变量是在量.tf 文件中定义的。这篇文章假设使用默认值:

variable "aws_region" {
  description = "The AWS region to create things in."
  default     = "us-east-1"
}

variable "collection_name" {
  description = "Name of the OpenSearch Serverless collection."
  default     = "example-collection"
}

创建加密策略

现在,已经安装并配置了提供程序,Terraform 配置可以继续定义 OpenSearch 无服务器安全策略。OpenSearch Serverless 使用 亚马逊云科技 密钥管理服务 (亚马逊云科技 KMS) 来 加密 您的数据 。加密由 加密策略 管理 。要创建加密策略,请使用 aws_opensearchserverless_security_policy 资源,该资源具有 名称 参数、 加密 类型 、定义策略 的 JSON 字符串 和可选描述:

# Creates an encryption security policy
resource "aws_opensearchserverless_security_policy" "encryption_policy" {
  name        = "example-encryption-policy"
  type        = "encryption"
  description = "encryption policy for ${var.collection_name}"
  policy = jsonencode({
    Rules = [
      {
        Resource = [
          "collection/${var.collection_name}"
        ],
        ResourceType = "collection"
      }
    ],
    AWSOwnedKey = true
  })
}

此加密策略名为 e xample-encryption-policy ,适用于名为 e xample-collection 的集合 ,并使用 亚马逊云科技 拥有的密钥来加密数据。

创建 OpenSearch 无服务器收藏集

您可以将 OpenSearch 索引 组织 成一个称为合的逻辑分组。使用 aws_opensearchserverless_collection 资源创建集合 ,该资源具有 名称 参数以及可选的描述、标签和类型:

# Creates a collection
resource "aws_opensearchserverless_collection" "collection" {
  name = var.collection_name

  depends_on = [aws_opensearchserverless_security_policy.encryption_policy]
}

这个集合被命名为 示例集合。 如果未指定 类型 ,则会创建 时间序列集合 。支持的集合类型可以在 a w s_opensearchserverless_collection 资源的 Terraform 文档中找到。OpenSearch Serverless 需要静态加密,因此在创建集合之前需要适用的加密策略。Terraform 配置使用 d epends_on 元参数明确定义了这种依赖关系。如果未定义此依赖关系,则可能会出现错误。

现在已经使用亚马逊云科技拥有的KMS密钥创建了集合,Terraform配置继续定义网络和数据访问策略以配置对集合的访问权限。

创建网络策略

网络策略 允许通过公共互联网或通过 OpenSearch 无服务器管理的 VPC 终端节点访问您的收藏集。与加密策略类似,要创建网络策略,请使用 aws_opensearchserverless_security_policy 资源,该资源具有 名称 参数、 网络 类型 、定义策略 的 JSON 字符串和可选描述:

# Creates a network security policy
resource "aws_opensearchserverless_security_policy" "network_policy" {
  name        = "example-network-policy"
  type        = "network"
  description = "public access for dashboard, VPC access for collection endpoint"
  policy = jsonencode([
    {
      Description = "VPC access for collection endpoint",
      Rules = [
        {
          ResourceType = "collection",
          Resource = [
            "collection/${var.collection_name}"
          ]
        }
      ],
      AllowFromPublic = false,
      SourceVPCEs = [
        aws_opensearchserverless_vpc_endpoint.vpc_endpoint.id
      ]
    },
    {
      Description = "Public access for dashboards",
      Rules = [
        {
          ResourceType = "dashboard"
          Resource = [
            "collection/${var.collection_name}"
          ]
        }
      ],
      AllowFromPublic = true
    }
  ])
}

此网络策略名为 e xample-network-policy,适用于名为 example- collection 的集合。 此策略仅允许通过 VPC 端点访问集合的 OpenSearch 端点,但允许公众访问 OpenSearch 控制面板端点。

您会注意到 VPC 终端节点尚未定义,但在网络策略中已对其进行了引用。Terraform 会自动确定此依赖关系,并且在创建 VPC 端点之前不会创建网络策略。

创建 VPC 终端节点

VPC 终端节点使您能够使用 亚马逊云科技 P rivateL ink 私密访问您的 OpenSearch 无服务器集合(有关更多信息,请参阅 通过 亚马逊云科技 PrivateLink 访问 亚马逊云科技 服务 )。 使用 aws_opensearchserverless_vpc_endpoint 资源创建 VPC 终端节点,您可以在其中定义 名称、vpc_ id、subnet_id,也可以定义安全组ID:

# Creates a VPC endpoint
resource "aws_opensearchserverless_vpc_endpoint" "vpc_endpoint" {
  name               = "example-vpc-endpoint"
  vpc_id             = aws_vpc.vpc.id
  subnet_ids         = [aws_subnet.subnet.id]
  security_group_ids = [aws_security_group.security_group.id]
}

创建 VPC 和所有必需的网络资源超出了本文的范围,但此处在单独的文件中创建了所需的最低 VPC 资源,以演示 VPC 终端节点的功能。要 了解更多信息,请参阅亚马逊 VPC 入门

创建数据访问策略

该配置定义了一个 数据源 ,用于查找有关当前运行 Terraform 的上下文的信息。定义数据访问策略时使用此数据源。 更多信息可以在 aws_caller_identity 的 Terraform 文档中找到。

# Gets access to the effective Account ID in which Terraform is authorized
data "aws_caller_identity" "current" {}

数据访问策略 允许您定义谁有权访问集合和索引。数据访问策略是使用 aws_opensearchserverless_access_policy 资源定义的,该资源具有 名称 参数、设置为 数据的 类型 参数 、定义策略 的 JSON 字符串和可选描述:

# Creates a data access policy
resource "aws_opensearchserverless_access_policy" "data_access_policy" {
  name        = "example-data-access-policy"
  type        = "data"
  description = "allow index and collection access"
  policy = jsonencode([
    {
      Rules = [
        {
          ResourceType = "index",
          Resource = [
            "index/${var.collection_name}/*"
          ],
          Permission = [
            "aoss:*"
          ]
        },
        {
          ResourceType = "collection",
          Resource = [
            "collection/${var.collection_name}"
          ],
          Permission = [
            "aoss:*"
          ]
        }
      ],
      Principal = [
        data.aws_caller_identity.current.arn
      ]
    }
  ])
}

此数据访问策略允许当前 亚马逊云科技 角色或用户对名为 e x ample- collection 的集合执行与集合相关的操作 , 并 对集合中的索引执行与索引相关的操作

使用 Terraform 进行部署

现在您已经配置了必要的资源,请使用 terraform apply 应用配置。 在创建资源之前,Terraform 将描述将要创建的所有资源,以便您可以验证配置:

$ terraform apply

...

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

...

Plan: 13 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + collection_enpdoint = (known after apply)
  + dashboard_endpoint  = (known after apply)

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value:

回答 “是 ” 继续。

如果这是你账户中的第一个 OpenSearch Serverless 集合,则应用配置可能需要 10 分钟以上的时间,因为 Terraform 会等待集合激活。

Apply complete! Resources: 13 added, 0 changed, 0 destroyed.

Outputs:

collection_enpdoint = "..."
dashboard_endpoint = "..."

您现在已经部署了 OpenSearch Serverless 时间序列集合,该集合具有配置加密和访问该集合的策略!

清理

只要资源处于运行状态,它们就会产生成本,因此请在使用完资源后清理资源。使用 terraform 销毁命令来执行此操作:

$ terraform destroy

...

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  - destroy

Terraform will perform the following actions:

  ...

Plan: 0 to add, 0 to change, 13 to destroy.

Changes to Outputs:

...

Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value:

回答 “是” 以运行此计划并摧毁基础架构。

Destroy complete! Resources: 13 destroyed.

本演练期间创建的所有资源现已删除。

结论

在这篇文章中,你创建了一个 OpenSearch 无服务器集合。使用像 Terraform 这样的 iaC 软件可以轻松管理您的资源,例如 OpenSearch 无服务器集合、加密、网络和数据访问策略以及 VPC 端点。

感谢所有帮助维护 OpenSearch 和 Terraform 的开 源贡献者。

尝试使用带有 Terraform 的 OpenSearch 无服务器来简化资源管理。查看亚马逊 OpenSe arch 无服务器 入门研讨会 和亚马逊 OpenSearch 无 服务器开发者指南,了解有关 OpenSearch 无服务器 的更多信息。


作者简介

Joshua Luo 是亚马逊 OpenSearch 无服务器的软件开发工程师。他开发的系统使客户能够管理和监控其 OpenSearch 无服务器资源。在业余时间,他喜欢抱石、摄影和录像。

萨蒂什·南迪 是亚马逊 OpenSearch S ervice 的高级技术产品经理。