View a markdown version of this page

使用代码存储库在中 AWS Service Catalog 配置 Terraform 产品 - AWS 规范指引

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用代码存储库在中 AWS Service Catalog 配置 Terraform 产品

Rahul Sharad Gaikwad 博士和 Tamilselvan P,Amazon Web Services

Summary

AWS Service Catalog 支持自助服务配置,并管理您的 HashiCorp Terraform 配置。如果您使用 Terraform,则可以使用 Service Catalog 作为单一工具,在其中大规模组织、管理和分发 Terraform 配置。 AWS 您可以访问 Service Catalog 的主要功能,包括对标准化和预先批准的基础架构即代码 (IaC) 模板进行编目、访问控制、使用最低权限访问的云资源配置、版本控制、与数 AWS 账户千人共享以及标记。最终用户(例如工程师、数据库管理员和数据科学家)会看到其有权访问的产品和版本列表,并且只需一个操作即可完成部署。

此模式可帮助您使用 Terraform 代码部署 AWS 资源。 GitHub 存储库中的 Terraform 代码可通过 Service Catalog 进行访问。借助此方法,您可以将产品整合到现有的 Terraform 工作流中。管理员可以使用 Terraform 创建 Service Catalog AWS Launch Wizard 产品组合并向其中添加产品。

这种解决方案的优点如下:

  • 由于 Service Catalog 中具有回滚功能,因此如果在部署过程中出现任何问题,可以将产品恢复到以前的版本。

  • 您可以轻松识别不同产品版本之间的差异。这有助于在部署期间解决问题。

  • 您可以在 Service Catalog 中配置存储库连接,例如到 GitHub 或 GitLab。您可以直接通过存储库更改产品。

有关总体优势的信息 AWS Service Catalog,请参阅什么是 Service Catalog

先决条件和限制

先决条件

  • 活跃 AWS 账户的.

  • GitHub BitBucket、或其他包含 ZIP 格式的 Terraform 配置文件的存储库。

  • AWS Serverless Application Model 已安装命令行界面 (AWS SAM CLI)。

  • AWS Command Line Interface (AWS CLI),已安装配置

  • 已安装 Go。

  • Python 版本 3.9,已安装。 AWS SAM CLI 需要这个版本的 Python。

  • 编写和运行 AWS Lambda 函数的权限以及访问和管理 Service Catalog 产品和产品组合的权限。

架构

通过代码存储库在 Service Catalog 中预调配 Terraform 产品的架构图

下图显示了如下工作流:

  1. 当 Terraform 配置准备就绪后,开发人员会创建一个包含所有 Terraform 代码的 .zip 文件。开发人员将 .zip 文件上传至连接到 Service Catalog 的代码存储库中。

  2. 管理员将 Terraform 产品与 Service Catalog 中的产品组合关联。管理员还会创建启动约束,以便最终用户预调配产品。

  3. 在 Service Catalog 中,最终用户使用 Terraform 配置启动 AWS 资源。他们可以选择要部署的产品版本。

工具

AWS 服务

  • AWS Lambda 是一项计算服务,可帮助您运行代码,无需预调配或管理服务器。它只在需要时运行您的代码,并自动进行扩展,因此您只需为使用的计算时间付费。

  • AWS Service Catalog帮助您集中管理已获批准的 IT 服务目录。 AWS最终用户可在遵循组织设定约束的情况下快速部署他们所需已获得批准的 IT 服务。

其他服务

  • Go 是谷歌支持的开源编程语言。

  • Python 是通用的计算机编程语言。

代码存储库

如果您需要可通过 Service Catalog 部署的 Terraform 示例配置,则可以使用 Amazon Mac GitHub ie 组织设置使用 Terraform 存储库中的配置。并非必须使用此存储库中的代码示例。

最佳实践

  • 在通过 Service Catalog 启动产品时配置变量值,而不是在 Terraform 配置文件 (terraform.tfvars) 中提供变量的值。

  • 仅向特定用户或管理员授予对产品组合的访问权限。

  • 遵循最低权限原则,并授予执行任务所需的最低权限。有关更多信息,请参阅 AWS Identity and Access Management (IAM) 文档中的授予最低权限安全最佳实践

操作说明

Task说明所需技能

(可选)安装 Docker。

如果要在开发环境中运行这些 AWS Lambda 函数,请安装 Docker。有关说明,请参阅 Docker 文档中的安装 Docker 引擎

DevOps 工程师

为 Terraform 安装 AWS Service Catalog 引擎。

  1. 输入以下命令克隆 AWS Service Catalog Engine for Terraform 存储库。

    git clone https://github.com/aws-samples/service-catalog-engine-for-terraform-os.git
  2. 导航到包含已克隆存储库的根目录。

  3. 输入如下命令。这将安装引擎。

    run ./bin/bash/deploy-tre.sh -r

    自动安装期间不使用默认配置文件中 AWS 区域 设置的内容。相反,在运行此命令时,您需要提供区域。

DevOps 工程师,AWS 管理员
Task说明所需技能

创建与 GitHub 存储库的连接。

  1. 登录 AWS 管理控制台,然后打开开发者工具控制台。您可以通过选择诸如 AWS CodePipeline 或之类的服务来访问开发者工具控制台 AWS CodeDeploy。

  2. 在左侧导航栏上,选择设置,然后选择连接

  3. 选择创建连接

  4. 选择用于维护 Terraform 源代码的存储库。例如,您可以选择 Bitbucket GitHub、或GitHub 企业服务器

  5. 输入连接的名称,然后选择连接

  6. 出现系统提示时,对存储库进行身份验证。

    身份验证完成后,连接即创建完毕,状态将更改为活动

AWS 管理员
Task说明所需技能

创建 Service Catalog 产品。

  1. 打开 AWS Service Catalog 控制台

  2. 导航到管理部分,然后选择产品列表

  3. 选择创建产品

  4. 创建产品页面的产品详细信息部分,选择外部产品类型。Service Catalog 使用此产品类型来支持 Terraform Community Edition 产品。

  5. 输入 Service Catalog 产品的名称和所有者。

  6. 选择 “使用 CodeStar 提供程序指定您的代码存储库”。

  7. 输入存储库的以下信息:

    • 使用连接您的提供商 AWS CodeConnections — 选择您之前创建的连接。

    • 存储库 – 选择存储库。

    • 分支 – 选择分支。

    • 模板文件路径 – 选择存储代码模板文件的路径。文件名应以 tar.gz 结尾。

  8. 版本名称和描述下,提供有关产品版本的信息。

  9. 选择创建产品

AWS 管理员

创建产品组合。

  1. 打开 AWS Service Catalog 控制台

  2. 导航到管理部分,然后选择产品组合

  3. 选择创建产品组合

  4. 输入以下值:

    • 产品组合名称Sample terraform

    • 产品组合描述Sample portfolio for Terraform configurations

    • 所有者 – 您的联系信息,例如电子邮件地址

  5. 选择创建

AWS 管理员

将 Terraform 产品添加到产品组合中。

  1. 打开 AWS Service Catalog 控制台

  2. 导航到管理部分,然后选择产品列表

  3. 选择之前创建的 Terraform 产品。

  4. 选择操作,然后选择将产品添加到产品组合

  5. 选择 Sample terraform 产品组合。

  6. 选择将产品添加到产品组合

AWS 管理员

创建访问策略。

  1. 打开 AWS Identity and Access Management (IAM)控制台

  2. 在导航窗格中,选择策略

  3. 在内容窗格中,选择创建策略

  4. 选择 JSON 选项。

  5. 在此模式其他信息部分的访问策略中,输入示例 JSON 策略。

  6. 选择下一步

  7. 审核和创建页面上的策略名称框中,输入 TerraformResourceCreationAndArtifactAccessPolicy

  8. 选择创建策略

AWS 管理员

创建自定义信任策略。

  1. 打开 IAM 控制台

  2. 在导航窗格中,选择角色

  3. 选择创建角色

  4. 对于可信实体类型,选择自定义信任策略

  5. 在 JSON 策略编辑器中,在此模式其他信息部分的信任策略中,输入示例 JSON 策略。

  6. 选择下一步

  7. 权限策略下,选择您之前创建的 TerraformResourceCreationAndArtifactAccessPolicy

  8. 选择下一步

  9. 角色详细信息下的角色名称框中,输入 SCLaunch-product。 

    重要

     角色名称必须以 SCLaunch 开头。

  10. 选择创建角色

AWS 管理员

向 Service Catalog 产品添加启动约束。

  1. 以具有管理权限的用户身份登录。 AWS 管理控制台

  2. 打开 AWS Service Catalog 控制台

  3. 在导航窗格中,选择产品组合

  4. 选择您之前创建的产品组合。

  5. 产品组合详细信息页面上,选择约束选项卡,然后选择创建约束

  6. 对于产品,选择您之前创建的 Terraform 产品。

  7. 启动约束下的方法中,选择输入角色名称

  8. 角色名称框中,输入 SCLaunch-product

  9. 选择创建

AWS 管理员

授予对产品的访问权限。

  1. 打开 AWS Service Catalog 控制台

  2. 在导航窗格中,选择产品组合

  3. 选择您之前创建的产品组合。

  4. 选择访问权限选项卡,然后选择授予访问权限

  5. 选择角色选项卡,然后选择应有权部署此产品的角色。

  6. 选择 Grant access (授予访问权限)

AWS 管理员

启动产品。

  1. 以有权部署 Service Catalog 产品的用户 AWS 管理控制台 身份登录。

  2. 打开 AWS Service Catalog 控制台

  3. 在导航窗格中,选择产品

  4. 选择您之前创建的产品,然后选择启动产品

  5. 输入产品名称并定义任何必要的参数。

  6. 选择启动产品

DevOps 工程师
Task说明所需技能

验证部署。

Service Catalog 配置工作流程有两台 AWS Step Functions 状态机:

  • ManageProvisionedProductStateMachine – 在预调配新的 Terraform 产品以及更新现有 Terraform 预调配产品时,Service Catalog 会调用此状态机。

  • TerminateProvisionedProductStateMachine – 在终止现有 Terraform 预调配产品时,Service Catalog 将调用此状态机。

您可以检查 ManageProvisionedProductStateMachine 状态机的日志,以确认产品已预调配。

  1. 登录 AWS 管理控制台,然后打开AWS Step Functions 控制台

  2. 在左侧导航面板中,选择状态机

  3. 选择 ManageProvisionedProductStateMachine

  4. 执行列表中,输入预调配的产品 ID 以找到您执行项。

    注意

    状态文件后端存储桶名称以 sc-terraform-engine-state- 开头。

  5. 验证账户中是否已创建所有必要的资源。

DevOps 工程师
Task说明所需技能

删除预调配产品。

  1. 以有权部署 Service Catalog 产品的用户 AWS 管理控制台 身份登录。

  2. 打开 AWS Service Catalog 控制台

  3. 在左侧导航栏中,选择预调配产品

  4. 选择您已创建的产品。

  5. 操作列表中,选择终止

  6. 在确认文本框中,输入 terminate,然后选择终止预调配的产品

  7. 重复这些步骤以终止所有预调配的产品。

DevOps 工程师

移除 Terraform 的 AWS Service Catalog 引擎。

  1. 以具有管理权限的用户身份登录。 AWS 管理控制台

  2. 打开 Amazon Simple Storage Service(Amazon S3)控制台

  3. 在导航窗格中,选择存储桶

  4. 选择 sc-terraform-engine-logging-XXXX 存储桶。

  5. 选择空白

  6. 对以下存储桶重复第 4–5 步:

    • sc-terraform-engine-state-XXXX

    • terraform-engine-bootstrap-XXXX

  7. 打开AWS CloudFormation 控制台,然后验证您的操作是否正确 AWS 区域。

  8. 在左侧导航栏中,选择堆栈

  9. 选择 SAM-TRE,然后选择删除。等待堆栈删除完成。

  10. 选择 Bootstrap-TRE,然后选择删除。等待堆栈删除完成。

AWS 管理员

相关资源

AWS 文档

Terraform 文档

附加信息

访问策略

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "s3:GetObject", "Resource": "*", "Condition": { "StringEquals": { "s3:ExistingObjectTag/servicecatalog:provisioning": "true" } } }, { "Action": [ "s3:CreateBucket*", "s3:DeleteBucket*", "s3:Get*", "s3:List*", "s3:PutBucketTagging" ], "Resource": "arn:aws:s3:::*", "Effect": "Allow" }, { "Action": [ "resource-groups:CreateGroup", "resource-groups:ListGroupResources", "resource-groups:DeleteGroup", "resource-groups:Tag" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "tag:GetResources", "tag:GetTagKeys", "tag:GetTagValues", "tag:TagResources", "tag:UntagResources" ], "Resource": "*", "Effect": "Allow" } ] }

信任策略

{ "Version": "2012-10-17", "Statement": [ { "Sid": "GivePermissionsToServiceCatalog", "Effect": "Allow", "Principal": { "Service": "servicecatalog.amazonaws.com" }, "Action": "sts:AssumeRole" }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::account_id:root" }, "Action": "sts:AssumeRole", "Condition": { "StringLike": { "aws:PrincipalArn": [ "arn:aws:iam::accounti_id:role/TerraformEngine/TerraformExecutionRole*", "arn:aws:iam::accounti_id:role/TerraformEngine/ServiceCatalogExternalParameterParserRole*", "arn:aws:iam::accounti_id:role/TerraformEngine/ServiceCatalogTerraformOSParameterParserRole*" ] } } } ] }