本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
开始使用 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 关联。
第 1 步:自动化部署(推荐)
使用提供的部署脚本简化设置:
./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 帐户(服务帐户)中的资源。这涉及两个操作:
添加指向服务帐号的源 AWS 关联。
在服务账户中部署跨账户 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-checkclient_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_space和awscc_devopsagent_association资源需要 AWS 云控制提供商。
资源清理
要移除所有资源,如果您部署了第 2 部分,请按相反的顺序销毁:
./cleanup.sh
或者手动:
terraform destroy
警告:这会永久删除您的代理空间和所有关联数据。在继续操作之前,请确保已备份所有重要信息。
安全注意事项
Terraform 配置使用仅允许
aidevops.amazonaws.com服务主体代入的信任策略创建 IAM 角色。信任政策包括限制访问您的特定 AWS 账户和代理空间 ARN 的条件。
所有政策都遵循最小权限原则。根据贵组织的安全要求审查和自定义 IAM 策略。
跨账户角色 (
DevOpsAgentRole-SecondaryAccount-TF) 使用固定名称,范围限定为特定的代理空间 ARN。
后续步骤
使用 Terraform 部署 AWS DevOps 代理后:
在《 DevOps 代理用户指南》中了解AWS DevOps 代理的全部功能。
考虑将 Terraform 部署集成到您的 CI/CD 管道中,以实现自动化基础设施管理。
其他资源
Terraform 注册表中的 awscc_devopsagent_assoc
iation 资源 Terraform 注册表中的 awscc_devopsagent_
private_connection 资源