View a markdown version of this page

开始使用 AWS DevOps 使用 Terraform 的代理 - AWS DevOps 代理人

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

开始使用 AWS DevOps 使用 Terraform 的代理

概述

本指南向您展示如何使用 Terraform 创建和部署 AWS DevOps 代理资源。Terraform 配置可自动创建代理空间、IAM 角色、运营商应用程序和 AWS 账户关联。

Terraform 方法通过将所有必需的资源定义为基础设施即代码,自动执行 CLI 入门指南中描述的手动步骤。

AWS DevOps 代理在以下 6 个 AWS 地区可用:美国东部(弗吉尼亚北部)、美国西部(俄勒冈)、亚太地区(悉尼)、亚太地区(东京)、欧洲(法兰克福)和欧洲(爱尔兰)。有关支持的区域的更多信息,请参阅支持的区域:

先决条件

在开始之前,请确保您具有以下各项:

  • Terraform >= 1.0 已安装

  • AWS 已安装 CLI 并使用相应的凭据进行配置

  • 监控(主要) AWS 账户的一个账户

  • (可选)如果您想设置跨 AWS 账户监控,请使用第二个账户

本指南涵盖的内容

本指南分为三个部分:

  • 第 1 部分 — 使用操作员应用程序和监控账户中的 AWS 关联来部署代理空间。完成此部分后,代理可以监控该账户中的问题。

  • 第 2 部分(可选)— 为服务账户添加源 AWS 关联,并将跨账户 IAM 角色和 echo Lambda 部署到该账户。这允许代理空间监控跨账户的资源。

  • 第 3 部分(可选)— 注册第三方服务(Dynatrace、 ServiceNow、Splunk、New Relic GitLab、 PagerDuty),并将其与代理空间关联起来。

创建的资源

第 1 部分:监控账户

  • IAM 角色 (DevOpsAgentRole-AgentSpace-*) — 由 DevOps 代理服务代为监控账户。包括AIDevOpsAgentAccessPolicy托管策略和允许创建资源管理器服务相关角色的内联策略。仅在未设置existing_agentspace_role_arn时创建。

  • IAM 角色 (DevOpsAgentRole-WebappAdmin-*) — 具有代理操作AIDevOpsOperatorAppAccessPolicy托管策略的运营商应用程序角色。仅在未设置existing_operator_role_arn时创建。

  • 代理空间(可配置名称)-使用awscc_devopsagent_agent_space资源创建的中央代理空间。包括操作员应用程序配置。

  • 关联(AWS 监视器)-使用awscc_devopsagent_association资源将监控帐户链接到代理空间。

  • 关联(AWS 来源)-(可选)将服务帐户链接到代理空间以进行跨账户监控。

第 2 部分:服务帐号(可选)

  • IAM 角色 (DevOpsAgentRole-SecondaryAccount-TF) — 具有固定名称的 Cross-account 角色。受监控账户中代理空间的信任。包括AIDevOpsAgentAccessPolicy托管策略和允许创建资源管理器服务相关角色的内联策略。

  • Lambda 函数 (echo-service-tf) — 一个回显输入事件的简单示例服务。

设置

第 1 步:克隆示例存储库

git clone https://github.com/aws-samples/sample-aws-devops-agent-terraform.git cd sample-aws-devops-agent-terraform

第 2 步:配置变量

复制示例变量文件并针对您的环境对其进行自定义:

cp terraform.tfvars.example terraform.tfvars

terraform.tfvars使用您的代理空间名称和描述进行编辑:

agent_space_name = "MyCompanyAgentSpace" agent_space_description = "DevOps Agent Space for monitoring production workloads"

第 1 部分:部署代理空间

在本节中,您将在监控账户中创建代理空间、IAM 角色、操作员应用程序和 AWS 关联。

使用提供的部署脚本简化设置:

./deploy.sh

这个脚本自动:

  • 检查先决条件(Terraform、 AWS CLI、证书)

  • 如果需要terraform.tfvars,根据示例创建

  • 初始化、验证、计划和应用 Terraform

或者,如果你更喜欢手动控制:

terraform init terraform plan terraform apply

yes在提示确认部署时键入。

第 2 步:记录输出

部署完成后,Terraform 会打印输出。记录这些值以备日后使用:

Outputs: agent_space_id = "abc123" agent_space_arn = "arn:aws:aidevops:<REGION>:<MONITORING_ACCOUNT_ID>:agentspace/abc123" agent_space_name = "MyCompanyAgentSpace" devops_agentspace_role_arn = "arn:aws:iam::<MONITORING_ACCOUNT_ID>:role/DevOpsAgentRole-AgentSpace-a1b2c3d4" devops_operator_role_arn = "arn:aws:iam::<MONITORING_ACCOUNT_ID>:role/DevOpsAgentRole-WebappAdmin-a1b2c3d4" primary_account_id = "<MONITORING_ACCOUNT_ID>" primary_account_association_id = "assoc-xyz"

如果您计划完成第 2 部分,请保存该agent_space_arn值。您将需要它来配置服务帐号资源。

步骤 3:验证部署

运行部署后验证脚本:

./post-deploy.sh

或者使用 AWS CLI 验证代理空间是否已成功创建:

aws devops-agent get-agent-space \ --agent-space-id <AGENT_SPACE_ID> \ --region <REGION>

此时,您的代理空间已部署完毕,同时启用了操作员应用程序并关联了您的监控帐户。代理可以监控此账户中的问题。

第 2 部分(可选):添加跨账户监控

在本节中,您将扩展设置,以便代理空间可以监控第二个 AWS 帐户(服务帐户)中的资源。这涉及两个操作:

  1. 添加指向服务帐号的源 AWS 关联。

  2. 在服务账户中部署跨账户 IAM 角色和 echo Lambda 函数。

重要

必须先完成第 1 部分,然后才能继续。服务帐号资源需要第 1 部分部署输出中的。agent_space_arn

步骤 1:配置服务帐号 ID

在中terraform.tfvars,设置您的服务帐号 ID:

service_account_id = "<YOUR_SERVICE_ACCOUNT_ID>"

第 2 步:设置代理空间 ARN

复制第 1 部分输出(步骤 2)中的agent_space_arn值并将其设置为terraform.tfvars

agent_space_arn = "arn:aws:aidevops:<REGION>:<MONITORING_ACCOUNT_ID>:agentspace/<SPACE_ID>"

服务帐号资源使用此值将信任策略的范围限定在辅助账户角色上。这些资源仅在设置此值时创建。

第 3 步:配置 `aws.service` 提供商

在中main.tf,使用服务帐号的凭据配置aws.service提供商别名。您可以使用指定配置文件或代入角色:

使用个人资料:

provider "aws" { alias = "service" region = var.aws_region profile = "your-service-account-profile" }

或者使用假设角色:

provider "aws" { alias = "service" region = var.aws_region assume_role { role_arn = "arn:aws:iam::<SERVICE_ACCOUNT_ID>:role/OrganizationAccountAccessRole" } }

第 4 步:部署

应用更新后的配置:

terraform apply

这将在服务帐号中创建以下资源:

  • 信任监控账户中的代理空间的 IAM 角色 (DevOpsAgentRole-SecondaryAccount-TF)

  • 一个 echo Lambda 函数 (echo-service-tf) 作为示例服务

它还在监控账户中创建了链接服务帐号的源 AWS 关联。

第 5 步:验证部署

测试 echo 服务以确认 Lambda 函数已成功部署:

aws lambda invoke \ --function-name echo-service-tf \ --payload '{"test": "hello world"}' \ --profile <your-service-account-profile> \ --region <REGION> \ response.json cat response.json

第 3 部分(可选):注册第三方集成

在本节中,您将向代理空间注册外部服务(Dynatrace ServiceNow、、Splunk、New Relic GitLab、 PagerDuty)。这些集成使 AWS DevOps 代理能够在调查期间访问遥测、事件数据和源代码控制信息。

与 AWS CDK 示例(需要单独的 IntegrationsStack 阶段和手动连接代理空间 ID)不同,这些资源直接引用代理空间,可以terraform apply像第 1 部分一样部署。

支持的集成

服务 服务类型 身份验证
Dynatrace dynatrace OAuth 客户端凭证
ServiceNow servicenow OAuth 客户端凭证
Splunk mcpserversplunk 持有者令牌
New Relic mcpservernewrelic API 密钥
GitLab gitlab 访问令牌
PagerDuty pagerduty OAuth 客户端凭证
注意

Datadog 不包含在 Terraform 配置中。连接 Datadog 需要交互式用户 OAuth 授权(浏览器登录和同意),如中所述正在连接 DataDog,而 Terraform 无法自动进行这种授权。通过控制台中的能力提供者页面手动注册 Datadog。

步骤 1:配置集成凭证

向中添加一个integrations区块terraform.tfvars,仅填充所需的服务。以下示例显示了 Dynatrace 集成:

integrations = { dynatrace = { account_urn = "<DYNATRACE_ACCOUNT_URN>" client_id = "<DYNATRACE_CLIENT_ID>" client_name = "<DYNATRACE_CLIENT_NAME>" client_secret = "<DYNATRACE_CLIENT_SECRET>" env_id = "<DYNATRACE_ENVIRONMENT_ID>" resources = ["<DYNATRACE_RESOURCE_1>"] } }

有关每个集成的完整形状,请参见示例存储库terraform.tfvars.example中的内容。

ServiceNow 要求:务必instance_id明确设置为短实例名称(例如,"ven04972"— 不是完整名称instance_url)。如果省略,instance_id则关联会退回到该关联instance_url, DevOps 代理 API 会使用 a 400 GeneralServiceException: instanceId '<url>' does not match the registered ServiceNow instance 拒绝该关联。

安全性:integrations变量已标记sensitive,因此其值将从计划和应用输出中删除。请勿将真实凭证提交给terraform.tfvars。在生产环境中,源密钥来自 AWS 密钥管理器或 AWS 系统管理器参数存储库(例如,使用data源代码),而不是纯文本。

第 2 步:部署

应用配置:

terraform apply

这会为每个启用的集成创建服务注册和关联。

第 3 步:查看输出

部署完成后,集成输出将每个启用的服务映射到其注册的 ID:

integration_service_ids = { "dynatrace" = "service-abc123" } integration_association_ids = { "dynatrace" = "assoc-xyz789" }

有关为每项服务配置凭据的更多信息,请参阅:

使用现有 IAM 角色(可选)

默认情况下,Terraform 配置为代理空间和运营商应用程序创建新的 IAM 角色。如果您已经拥有具有所需策略的 IAM 角色,则可以跳过角色创建,改为提供现有角色 ARN。

要求

现有角色必须满足以下要求:

代理空间角色

  • 信任策略aidevops.amazonaws.com允许使用以下方式代入角色 sts:AssumeRole

  • 是否已附加AIDevOpsAgentAccessPolicy托管策略

  • (可选)具有允许创建资源管理器服务相关角色的内联策略

操作员应用程序角色

  • 信任策略aidevops.amazonaws.com允许使用sts:AssumeRole和代入角色 sts:TagSession

  • 是否已附加AIDevOpsOperatorAppAccessPolicy托管策略

配置

在中terraform.tfvars,设置一个或两个角色 ARN:

existing_agentspace_role_arn = "arn:aws:iam::ACCOUNT_ID:role/YourAgentSpaceRole" existing_operator_role_arn = "arn:aws:iam::ACCOUNT_ID:role/YourOperatorRole"

设置这些值时,将跳过中相应iam.tf的角色资源。这种方法完全向后兼容——带有空值(默认)的现有配置保留了当前的角色创建行为。

问题排查

IAM 传播延迟

  • 该配置包括创建 IAM 角色和创建代理空间time_sleep之间的 30 秒。 DevOps 代理服务在代理空间创建期间验证操作员角色的信任策略,如果 IAM 尚未完全传播,则可能会失败。如果您仍然看到信任策略错误,请稍等片刻然后terraform apply重新运行 — IAM 角色将已经存在,应用程序将从中断的地方继续运行。

ServiceNow instanceId does not match错误

  • service_now集成块中instance_id明确设置为短实例名称(例如,"ven04972"),而不是完整名称instance_url。参见上文第 3 部分中的注释。

Dynatrace 协会 status: invalid

  • 如果terraform apply成功但生成的关联报告status = "invalid"(使用控制台可见),aws devops-agent get-association则表示 Dynatrace 拒绝了 OAuth 客户端证书。 Double-check client_idclient_secret,而且是account_urn针对 Dynatrace 账户的,而不是 Terraform 配置问题。

权限错误

  • 验证您的 AWS 证书是否具有创建角色和策略所必需的 IAM 权限。

  • 检查信任政策条件是否与您的账户 ID 相匹配。

Cross-account 部署失败

  • 必须为aws.service提供商配置服务帐号的证书。使用命名配置文件或代入角色块。

  • 验证该agent_space_arn值是否与第 1 部分输出的 ARN 相匹配。

找不到 Terraform 资源类型

  • 确认您拥有awscc提供商版本~> 1.0或更高版本。awscc_devopsagent_agent_spaceawscc_devopsagent_association资源需要 AWS 云控制提供商。

资源清理

要移除所有资源,如果您部署了第 2 部分,请按相反的顺序销毁:

./cleanup.sh

或者手动:

terraform destroy

警告:这会永久删除您的代理空间和所有关联数据。在继续操作之前,请确保已备份所有重要信息。

安全注意事项

  • Terraform 配置使用仅允许aidevops.amazonaws.com服务主体代入的信任策略创建 IAM 角色。

  • 信任政策包括限制访问您的特定 AWS 账户和代理空间 ARN 的条件。

  • 所有政策都遵循最小权限原则。根据贵组织的安全要求审查和自定义 IAM 策略。

  • 跨账户角色 (DevOpsAgentRole-SecondaryAccount-TF) 使用固定名称,范围限定为特定的代理空间 ARN。

后续步骤

使用 Terraform 部署 AWS DevOps 代理后:

  1. 在《 DevOps 代理用户指南》中了解AWS DevOps 代理的全部功能

  2. 考虑将 Terraform 部署集成到您的 CI/CD 管道中,以实现自动化基础设施管理。

其他资源