无服务器和 AWS ECS Fargate
AWS Fargate 是一个无服务器的按需付费引擎,用于 Amazon Elastic Container Service (ECS) 来运行 Docker 容器,而无需管理服务器或集群。Fargate 的目标是将您的应用程序容器化,并指定启动所需的操作系统、CPU 和内存、网络以及 IAM 策略。此外,AWS Fargate 可以以类似方式与 Elastic Kubernetes Service (EKS) 一起使用。
尽管服务器的配置将由第三方处理,但在无服务器环境中了解容器的运行状况和性能,对于识别根本原因和系统中断变得更加重要。无服务器仍然需要可观测性。Elastic Observability 不仅可以为带有 Fargate 的 AWS ECS 提供可观测性(正如我们将在本博客中讨论的那样),还可以为许多 AWS 服务(EC2、RDS、ELB 等)提供可观测性。请参阅我们之前的博客,了解如何使用 Elastic Observability 管理基于 EC2 的应用程序。
使用 Elastic Observability 获得完全可见性
Elastic Observability 由在系统中创建完全可见性所涉及的三个支柱组成:日志、指标和跟踪。日志列出系统中发生的所有事件。指标跟踪可以告诉您系统是否宕机的数据,例如响应时间、CPU 使用率、内存使用率和延迟。跟踪可以很好地指示您的系统基于请求执行的性能。
这些支柱本身提供了一些见解,但将它们结合起来可以使您看到系统的全部范围以及它如何随着时间的推移处理负载或流量的增加。将 Elastic Observability 连接到您的无服务器环境将帮助您更快地处理中断,并执行根本原因分析以防止未来出现任何问题。
在本文中,我们将指导您如何安装带有AWS Fargate 集成的 Elastic Agent 作为边车容器,以将主机指标和日志发送到 Elastic Observability。
先决条件
- 已配置 AWS CLI 的 AWS 账户
- GitHub 账户
- Elastic Cloud 账户
- 在 AWS 中的容器上运行的应用程序
本教程分为两部分
- 设置 Fleet 服务器,供 AWS 中的边车容器使用。
- 在 AWS Fargate 中创建边车容器,以将数据发送回 Elastic Observability。
第一部分:设置 Fleet 服务器
首先,让我们登录到 Elastic Cloud。
您可以创建新的部署,也可以使用现有的部署。
在主页中,使用侧面板滚动到“管理”>“Fleet”>“代理策略”。单击添加策略。
单击创建代理策略。在这里,我们将创建一个策略以附加到 Fleet 代理。
为策略命名并保存更改。
单击创建代理策略。您应该在策略列表中看到代理策略 AWS Fargate。
现在我们有了代理策略,让我们添加集成以从主机收集日志和指标。单击 AWS Fargate -> 添加集成。
我们将添加到策略 AWS 以收集整体 AWS 指标,以及 AWS Fargate 以从此集成收集指标。您可以通过在搜索栏中键入每个集成来找到它们。
单击集成后,它将带您进入其登录页面,您可以在其中将其添加到策略中。
对于 AWS 集成,我们将配置的唯一收集设置是“收集计费指标”、“从 CloudWatch 收集日志”、“从 CloudWatch 收集指标”、“收集 ECS 指标”和“收集使用情况指标”。其他所有内容都可以保持禁用状态。
使用此集成时,需要记住的另一件事是需要从 AWS 收集数据的一组权限。可以在 AWS 集成页面上的“AWS 权限”下找到此内容。记下这些权限,因为我们将使用它们来创建 IAM 策略。
接下来,我们将添加 AWS Fargate 集成,该集成不需要进一步的配置设置。
现在我们已经创建了代理策略并附加了适当的集成,让我们创建将实现该策略的代理。导航回主 Fleet 页面,然后单击添加代理。
由于我们将通过 ECS 连接到 AWS Fargate,因此主机类型应设置为此值。所有其他默认值都可以保持不变。
最后,让我们创建注册令牌并附加代理策略。这将使 AWS ECS Fargate 能够访问 Elastic 并发送数据。
创建后,您应该能够看到列出的策略名称、密钥和代理策略。
我们将在下一步中使用我们的 Fleet 凭据,以便从 AWS Fargate 向 Elastic 发送数据。
第二部分:将数据发送到 Elastic Observability
现在是时候创建我们的 ECS 集群、服务和任务定义,以便开始运行容器。
登录您的 AWS 账户并导航至 ECS。
我们将从创建集群开始。
为集群添加一个名称。对于子网,仅选择 us-east-1a 和 us-eastlb 的前两个。
为了演示,我们将保留其余选项的默认设置。点击 创建。
我们应该看到我们创建的集群在下面列出。
现在我们已经创建了用于托管容器的集群,我们需要创建一个任务定义,用于设置我们的容器。但在我们执行此操作之前,我们需要创建一个具有关联策略的任务角色。此任务角色将允许将 AWS 指标从 AWS 发送到 Elastic Agent。
导航至 AWS 中的 IAM。
转到 策略 -> 创建策略。
现在,我们将引用 Fleet AWS 集成页面中的 AWS 权限,并使用它们来配置策略。除了这些权限,我们还将为 ECR 添加 GetAtuhenticationToken 操作。
您可以使用可视化编辑器配置每一项。
或者,使用 JSON 选项。不要忘记将 <account_id> 替换为您自己的账户 ID。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"sqs:DeleteMessage",
"sqs:ChangeMessageVisibility",
"sqs:ReceiveMessage",
"ecr:GetDownloadUrlForLayer",
"ecr:UploadLayerPart",
"ecr:PutImage",
"sts:AssumeRole",
"rds:ListTagsForResource",
"ecr:BatchGetImage",
"ecr:CompleteLayerUpload",
"rds:DescribeDBInstances",
"logs:FilterLogEvents",
"ecr:InitiateLayerUpload",
"ecr:BatchCheckLayerAvailability"
],
"Resource": [
"arn:aws:iam::<account_id>:role/*",
"arn:aws:logs:*:<account_id>:log-group:*",
"arn:aws:sqs:*:<account_id>:*",
"arn:aws:ecr:*:<account_id>:repository/*",
"arn:aws:rds:*:<account_id>:target-group:*",
"arn:aws:rds:*:<account_id>:subgrp:*",
"arn:aws:rds:*:<account_id>:pg:*",
"arn:aws:rds:*:<account_id>:ri:*",
"arn:aws:rds:*:<account_id>:cluster-snapshot:*",
"arn:aws:rds:*:<account_id>:cev:*/*/*",
"arn:aws:rds:*:<account_id>:og:*",
"arn:aws:rds:*:<account_id>:db:*",
"arn:aws:rds:*:<account_id>:es:*",
"arn:aws:rds:*:<account_id>:db-proxy-endpoint:*",
"arn:aws:rds:*:<account_id>:secgrp:*",
"arn:aws:rds:*:<account_id>:cluster:*",
"arn:aws:rds:*:<account_id>:cluster-pg:*",
"arn:aws:rds:*:<account_id>:cluster-endpoint:*",
"arn:aws:rds:*:<account_id>:db-proxy:*",
"arn:aws:rds:*:<account_id>:snapshot:*"
]
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": [
"sqs:ListQueues",
"organizations:ListAccounts",
"ec2:DescribeInstances",
"tag:GetResources",
"cloudwatch:GetMetricData",
"ec2:DescribeRegions",
"iam:ListAccountAliases",
"sns:ListTopics",
"sts:GetCallerIdentity",
"cloudwatch:ListMetrics"
],
"Resource": "*"
},
{
"Sid": "VisualEditor2",
"Effect": "Allow",
"Action": "ecr:GetAuthorizationToken",
"Resource": "arn:aws:ecr:*:<account_id>:repository/*"
}
]
}
查看您的更改。
现在让我们将此策略附加到角色。导航至 IAM -> 角色。点击 创建角色。
选择 AWS 服务作为可信实体类型,并选择 EC2 作为使用案例。点击 下一步。
在权限策略下,选择我们刚刚创建的策略,以及 CloudWatchLogsFullAccess 和 AmazonEC2ContainerRegistryFullAccess。点击 下一步。
为任务角色提供一个名称和描述。
点击 创建角色。
现在是时候创建任务定义了。导航至 ECS -> 任务定义。点击 创建新任务定义。
让我们为此任务定义提供一个名称。
在为任务定义命名后,您将把 Fleet 凭证添加到容器部分,您可以从 Elastic Cloud 中 Fleet 部分的 Enrollment Tokens 部分获取。这允许我们将 Elastic Agent 作为 sidecar 托管在 ECS 容器上,并使用 Fleet 凭证将数据发送到 Elastic。
-
容器名称:elastic-agent-container
-
镜像:docker.elastic.co/beats/elastic-agent:8.16.1
现在让我们添加环境变量
-
FLEET_ENROLL: yes
-
FLEET_ENROLLMENT_TOKEN: <enrollment-token>
-
FLEET_URL: <fleet-server-url>
为了演示,将环境、监控、存储和标签保留为默认值。现在,我们将需要创建第二个容器来运行存储在 ECR 中的 golang 应用程序的镜像。点击 添加更多容器。
对于环境,我们将保留 1 个 vCPU 和 3 GB 的内存。在任务角色下,搜索我们创建的使用 IAM 策略的角色。
查看更改,然后点击 创建。
您应该看到您的新任务定义包含在列表中。
最后一步是创建将直接连接到 fleet 服务器的服务。
导航到您创建的集群,然后在“服务”选项卡下点击 创建。
让我们配置我们的服务环境。
设置部署配置。在这里,您应该提供您在上一步中创建的任务定义的名称。此外,为服务提供一个唯一的名称。将 期望的任务数 设置为 2 而不是 1。
点击 创建。现在,您的服务正在集群中使用您提供的任务定义运行两个任务。
回顾一下,我们在 Elastic Cloud 中设置了 Fleet 服务器以接收 AWS Fargate 数据。然后,我们使用在容器中实现的 Fleet 凭证创建了我们的 AWS Fargate 集群任务定义。最后,我们创建了服务以将有关我们主机的数据发送到 Elastic。
现在,让我们验证我们的 Elastic Agent 是否运行状况良好,并正确地从 AWS Fargate 接收数据。
我们还可以在 Observability 概述页面上查看更详细的代理分解。
如果我们深入到主机,通过点击主机名,我们应该能够看到更精细的数据。例如,我们可以看到部署在我们的 AWS Fargate 环境中的 Elastic Agent 本身的 CPU 使用率。
最后,我们可以查看使用我们的 Elastic Agent 收集的数据生成的 AWS Fargate 仪表板。这是一个开箱即用的仪表板,也可以根据您想要可视化的数据进行自定义。
正如您在仪表板中看到的那样,我们可以根据正在运行的任务进行过滤,还可以看到在我们的环境中运行的容器列表。另一个可能有用的是显示每个集群的 CPU 使用率,如“每个集群的 CPU 使用率”下所示。
仪表板可以从不同的来源提取数据,在本例中显示 AWS Fargate 和更大的 ECS 集群的数据。底部的两个容器直接显示来自 ECS 的 CPU 和内存使用率。
结论
在本文中,我们展示了如何使用 Elastic Agent 和 Fleet 将数据从 AWS Fargate 发送到 Elastic Observability。无服务器架构正在迅速成为行业标准,将服务器的管理外包给第三方。但是,这并不能减轻运维工程师管理这些环境中生成的数据的责任。Elastic Observability 提供了一种不仅可以提取无服务器架构中的数据,还可以建立路线图以解决未来问题的方法。
通过 AWS Marketplace 注册并快速在世界各地 AWS 上的 Elastic Cloud 区域 中几分钟内启动部署,开始您自己的 7 天免费试用。您在 AWS Marketplace 上购买的 Elastic 将包含在您的每月合并账单中,并将从您与 AWS 的承诺支出中扣除。
关于无服务器和可观察性以及 AWS 的更多资源
- 在 Elastic Observability 上分析您的 AWS 应用程序的服务指标(EC2、ELB、RDS 和 NAT)
- 通过 Elastic Observability 了解 AWS Lambda 无服务器函数
- 使用 Elastic APM 和 Tracetest 进行基于跟踪的测试
- 通过 AWS Firehose 将 AWS 日志发送到 Elastic
本文中描述的任何功能或功能的发布和时间安排均由 Elastic 自行决定。任何当前不可用的功能或功能可能不会按时或根本不交付。