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

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

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

由 Rahul Sharad Gaikwad 博士 (AWS) 和 Tamilselvan P (AWS) 编写

环境:PoC 或试点

技术:基础设施; DevOps

工作负载:所有其他工作负载

AWS 服务:AWS Service Catalog;亚马逊 EC2

Summary

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

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

以下是此解决方案的好处:

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

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

  • 您可以在服务目录中配置存储库连接,例如到 GitHub GitLab、或 AWS CodeCommit。您可以直接通过存储库进行产品更改。

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

先决条件和限制

先决条件

  • 一个有效的 Amazon Web Services account。

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

  • 已安装 AWS 无服务器应用程序模型命令行界面 (AWS SAM CLI)。

  • 已安装配置 AWS 命令行界面(AWS CLI)。

  • 去吧,安装好了

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

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

架构

目标技术堆栈

  • AWS Service Catalog

  • AWS Lambda

目标架构

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

图表显示了以下工作流:

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

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

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

工具

Amazon Web Services 和工具

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

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

其他服务

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

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

代码存储库

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

最佳实践

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

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

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

操作说明

任务描述所需技能

(可选)安装 Docker。

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

DevOps 工程师

安装适用于 Terraform 的 AWS Service Catalog 引擎。

  1. 输入以下命令克隆适用于 Terraform 存储库的 AWS Service Catalog 引擎

    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 管理员
任务描述所需技能

创建与 GitHub 存储库的连接。

  1. 登录 AWS 管理控制台,然后打开开发者工具控制台。您可以通过选择 AWS CodePipeline、AWS 或 AWS 等服务来访问开发人员工具控制台 CodeDeploy。 CodeCommit

  2. 在左侧导航窗格中,选择 “设置”,然后选择 “连接”。

  3. 选择创建连接

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

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

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

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

AWS 管理员
任务描述所需技能

创建 Service Catalog 产品。

  1. 打开 AWS Service Catalog 控制台

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

  3. 选择创建产品

  4. 产品详情部分的创建产品页面上,选择外部产品类型。Service Catalog 使用此产品类型来支持 Terraform 社区版产品。

  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 身份和访问管理 (IAM) 控制台

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

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

  4. 选择 JSON 选项。

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

  6. 选择下一步

  7. 查看并创建页面的策略名称框中输入TerraformResourceCreationAndArtifactAccessPolicy

  8. 选择 创建策略

AWS 管理员

创建自定义信任策略。

  1. 打开 AWS 身份和访问管理 (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. 选择您之前创建的农产品,然后选择 Launch 产品

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

  6. 选择启动产品

DevOps 工程师
任务描述所需技能

验证部署。

服务目录配置工作流程有两台 AWS Step Functions 状态机:

  • ManageProvisionedProductStateMachine—在配置新的 Terraform 产品和更新现有 Terraform 预配置产品时,服务目录会调用此状态机。

  • TerminateProvisionedProductStateMachine—服务目录在终止现有的 Terraform 预配置产品时调用此状态机。

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

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

  2. 在左侧导航窗格中,选择状态机

  3. 选择 ManageProvisionedProductStateMachine

  4. 执行列表中,输入预配置的产品 ID 以查找执行。

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

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

DevOps 工程师
任务描述所需技能

删除预配置的产品。

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

  2. 打开 AWS Service Catalog 控制台

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

  4. 选择您创建的产品。

  5. 在 “操作” 列表中,选择 “终止”。

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

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

DevOps 工程师

移除适用于 Terraform 的 AWS Service Catalog 引擎。

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

  2. 打开 Amazon S3 控制台

  3. 在导航窗格中,选择

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

  5. 选择 “”。

  6. 对以下存储桶重复步骤 4—5:

    • sc-terraform-engine-state-XXXX

    • terraform-engine-bootstrap-XXXX

  7. 打开 A WS 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*" ] } } } ] }