我在Azure上尝试使用Terraform Cloud

bitFlyer Advent Calendar 2022 第18天的介绍。

大家好。最近为了提高居家时间的生活质量,我迷上了DIY,在入口处增设了一些货架。我是bitFlyer SRE部门的遠地。

本文将介绍我们如何为Azure构建Terraform Cloud,并分享一些相关的经验。

太长不看

    • 「開発と運用の職務分離」や「最小権限の原則」のために、Terraform Cloudの設定自体をコード化

 

    • いくつかの落とし穴回避ポイント

ドメインapp.terraform.ioを社内プロキシの対象から外す
Azure DevOpsのApplicationの追加はProject Collection Administrator権限を持ったユーザで行う
Terraform CloudのユーザはActive Directory側で定義

Terraform Cloudにprojectの概念が欲しかった日々だった

背景

在一个下午,令和酱(一名四岁的孩子)正在玩气压滑梯。一位SRE工程师十分苦恼。由于服务数量增加,他希望有更多的人能够使用terraform。

在我们公司目前正在进行微服务迁移项目。是的,这意味着我们要在云上管理越来越多的基础设施。因此,SRE部门将基础设施转化为terraform代码,并将管理权交给了开发团队,以确保不成为瓶颈。

然而,随着terraform存储库的增加,CI/CD和tfstate的管理以及工作流程说明的负担也逐渐增加。因此,”让我们引入Terraform Cloud!让大家能够更轻松地使用!” 这个大浪潮必然会到来,PoC已经揭开了序幕。

重要文件

由于我们公司属于金融行业,因此需要严格的访问控制。

    • 開発と運用の職務分離

 

    • サービスの開発をする人と、デプロイ・保守する人を分ける。

 

    • 最小権限の原則

 

    最低限必要なアクセス権限だけを付与する。

另外,在以下所述的环境条件下进行配置。

    • クラウドはAzureを使用

 

    Active DirectoryでSSO連携

换句话说,我们希望在满足“开发和运维的职责分离”以及“最小权限原则”的要求的前提下,通过在Terraform Cloud中与Azure进行SSO集成,在Active Directory中构建Azure资源。

構成的考虑 de

为了实现“开发与运维职责分离”,我们将设立开发团队和运维团队。开发团队仅能访问验证环境,而运维团队可以访问验证环境和正式环境。

在Terraform Cloud的配置中,我认为您可以从以下两个选项中选择。

    • 2つのorganizationを使って根本から分離

 

    1つのorganization内でチームの機能を使って分離

是指像下面这个表格一样的情况对吗?

複数organization構成単一organization構成Organizations開発チーム, 運用チーム-Teams-開発チーム, 運用チーム

如果是由多个组织构成,就可以明确地分隔开来,这样让人感到安心。然而,如果是由单一组织构成,有以下多种好处。

    • 開発チームは本番環境のterraform planの結果を同一organization内で確認できる

 

    • Registry moduleが一箇所で済む

 

    Organization毎に発生するライセンス料を節約できる

因此,我们公司选择了单一组织结构。为了有效地管理团队的划分,我们会将Terraform Cloud的配置代码化,并建立相应的CI/CD环境。

造成的案子

terraform-cloud-teams.png
    • Active DirectoryでSSO連携します。

 

    • Active Directoryのgroupと、Terraform Cloud上のteamを対応させます。

 

    Terraform Cloudのteamごとのアクセス制御をコード化し、Azure DevOpsにCI/CDパイプラインを構築します。

步驟

在Active Directory中进行单点登录(SSO)集成。

在構建SSO連接時,我們將參考Microsoft Azure AD – Single Sign-on。

如果在公司内部使用内部代理等来访问公司内部互联网,如果认证无法成功,请将域名app.terraform.io排除在外。

将Active Directory的群组与Terraform Cloud上的团队进行对应。

将Active Directory进行配置

微软Azure AD – 单点登录的”团队和用户名属性”项中有说明,但需要先掌握Active Directory知识才能理解,难度较高。因此,下面将展示实际的建立步骤。

image.png
image.png

在Terraform Cloud上设置SSO团队ID。

请记下Active Directory中群组的Object ID。
Terraform Cloud › 组织设置 › 团队
在「SSO团队ID」中输入Object ID,然后点击「更新团队」按钮。
请重复此操作,以适用于所有团队。

通过上述的步骤,应该可以将Active Directory中的群组与Terraform Cloud上的团队进行对应。请使用SSO进行登录并进行确认。

将Terraform Cloud中每个团队的访问控制编码化。

那么,我们来让Azure DevOps的Pipelines能够进行Terraform Cloud的配置。

添加VCS提供者

根据 Terraform Cloud 的参考,我们将添加 VCS 提供商到 Azure DevOps Services。

请使用具有Project Collection Administrator权限的用户添加Azure DevOps应用程序。否则,您将无法为添加的版本控制系统提供程序创建Webhook权限,并无法从CI/CD创建Terraform Cloud工作区。

生成 Terraform Cloud令牌。

使用 Terraform Cloud API Tokens 作为参考,在管理体制中生成与 Terraform Cloud 兼容的令牌,并将其存储在可以从 Terraform Cloud CI/CD 管道中作为环境变量 TFE_TOKEN 访问的位置。(我们公司将其存储在 Azure Key Vault 中。)

添加VCS提供商

借鉴Azure DevOps Services – VCS提供者 – Terraform Cloud的概念,在Azure中注册了一个用于存放terraform代码版本的版本控制系统。

設置Azure身份验证信息

将Azure资源操作的Service Principal的认证信息放入Terraform Cloud的Variable Sets中。

ARM_SUBSCRIPTION_ID
ARM_TENANT_ID
ARM_CLIENT_ID
ARM_CLIENT_SECRET  # sensitive attributeとして追加

在测试环境和生产环境中,分别进行定义。

编写代码以控制Terraform Cloud的团队、工作区和变量集的访问控制。

在编写代码时,参考TFE提供商的指南,进行访问控制。

通过Terraform Cloud,现在已经完成在Azure上构建资源的准备工作?

讲解

为什么要通过Active Directory而不是代码来进行团队分组?

在Terraform Cloud中存在一个名为“组织成员ID被重新分配问题”的问题。
例如,我们预先定义了用户的成员资格情况,并在tfe_organization_membership中进行了设置。然后,当用户首次使用SSO登录时,会导致新的ID(组织成员ID)被分配,并导致tfstate与之不一致。

换句话说,我们无法提前定义”用户所在的团队状态”,因此我们需要采取下列任一避免方案。

    • SSOサインインを待ってからCI/CDを走らせる

 

    あるいは、新しく振られたIDをterraform importする

为了避免操作的复杂程度增加,我们放弃了使用terraform定义用户所属团队,并决定在Active Directory的群组中进行定义。

创建Azure DevOps应用程序时,需要注意以下几点:
– 必须以Project Collection管理员的身份进行创建。

我们需要由拥有项目集合管理员权限的人员创建Azure DevOps应用程序。

虽然将具有如此强大权限的应用程序连接到Terraform Cloud的Azure DevOps集成存在风险,但另一方面,如果不对工作区创建进行编码,管理者级别的人员将需要处理所有工作区的创建,这非常繁琐。

因此,对于Terraform Cloud的代码审查等,需要采取措施来防止错误代码的混入。

曾经有过渴望拥有Terraform Cloud项目这个概念的日子。

terraform-cloud-project.png

这次我们以“开发团队”和“运营团队”分开的例子为例,但是如果按照这个例子,只需创建一个“验证环境”和“生产环境”的项目,然后定义团队和项目的关系,就可以简化 Terraform Cloud 的设置。

正在招聘工程师!

bitFlyer正在寻找对日常进行工作流程改进、服务稳定性和效率提升的SRE工程师以加入我们的团队。如果您对此感兴趣,请务必申请!

广告
将在 10 秒后关闭
bannerAds