Jonathan Simon

如何在 AWS App Runner 上使用 Elastic 可观测性部署 Hello World Web 应用程序

按照逐步流程,为在 AWS App Runner 上运行的 Hello World Web 应用程序检测 Elastic 可观测性。

11 分钟阅读
How to deploy a Hello World web app with Elastic Observability on AWS App Runner

Elastic 可观测性是提供对环境中运行的 Web 应用程序的可见性的首选工具。AWS App Runner 是首选的无服务器平台,用于运行需要大规模向上和向下扩展以满足需求或最大限度降低成本的 Web 应用程序。Elastic 可观测性与 AWS App Runner 相结合是开发人员部署具有完全可观测操作的自动缩放 Web 应用程序的完美解决方案,其实现和管理方式都非常简单。

这篇博客文章将向您展示如何将简单的 Hello World Web 应用程序部署到 App Runner,然后引导您完成检测 Hello World Web 应用程序的步骤,以使用 Elastic Cloud 实现对应用程序操作的观察。

Elastic 可观测性设置

我们将从设置 Elastic Cloud 部署开始,这将是我们部署的 Web 应用程序进行可观测性的地方。

Elastic Cloud 控制台,选择创建部署

输入部署名称,然后单击创建部署。创建您的部署需要几分钟时间。在等待期间,系统会提示您保存部署的管理员凭据,这将使您可以对 Elastic® 部署进行超级用户访问。请妥善保管这些凭据,因为它们仅显示一次。

Elastic 可观测性需要 APM 服务器 URL 和 APM 密钥令牌,以便应用程序将可观测性数据发送到 Elastic Cloud。创建部署后,我们将复制 Elastic 可观测性服务器 URL 和密钥令牌,并将其安全地存储在某个位置,以便在后续步骤中添加到我们的 Web 应用程序代码中。

要复制 APM 服务器 URL 和 APM 密钥令牌,请转到 Elastic Cloud。然后转到部署页面,该页面列出了您创建的所有部署。选择要使用的部署,这将打开部署详细信息页面。在 Kibana® 链接行中,单击打开以打开部署的 Kibana

从顶层菜单中选择集成。然后单击 APM 图块。

在 APM 代理页面上,复制 secretToken 和 serverUrl 值,并保存它们以便在后续步骤中使用。

现在我们已经完成了 Elastic Cloud 设置,下一步是设置我们的 AWS 项目,以便将应用程序部署到 App Runner。

AWS App Runner 设置

要开始使用 AWS App Runner,您需要一个 AWS 账户。如果您是新用户,请转到 aws.amazon.com 注册一个新账户。

设置 AWS CloudShell

我们将使用 AWS CloudShell 执行创建 Python Hello World 应用程序镜像并将其推送到 AWS ECR 的过程。

我们将使用 Docker 来构建示例应用程序镜像。请执行以下五个步骤,在 CloudShell 中设置 Docker。

  1. 打开 AWS CloudShell

  1. 运行以下两个命令,在 CloudShell 中安装 Docker
sudo yum update -y
sudo amazon-linux-extras install docker
  1. 通过运行以下命令启动 Docker
sudo dockerd
  1. Docker 运行后,通过单击操作下拉菜单并选择新建选项卡,在 CloudShell 中打开一个新的选项卡。

  1. 运行以下命令以在 CloudShell 中验证 Docker。在下面的 Docker 命令中,将 <account_id> 替换为您的 AWS 账户 ID,然后在 CloudShell 中运行它。
aws ecr get-login-password --region us-east-2 | sudo docker login --username AWS --password-stdin <account_id>.dkr.ecr.us-east-2.amazonaws.com

构建 Hello World Web 应用程序镜像并将其推送到 AWS ECR

我们将使用 AWS ECR,亚马逊完全托管的容器注册表,用于存储和部署应用程序镜像。要构建 Hello World 应用程序镜像并将其推送到 AWS ECR,我们将在 AWS CloudShell 中执行以下六个步骤

  1. 在 CloudShell 中运行以下命令,在 AWS ECR 中创建一个存储库。
aws ecr create-repository \
    --repository-name elastic-helloworld/web \
    --image-scanning-configuration scanOnPush=true \
    --region us-east-2

“elastic-helloworld” 将是应用程序的名称,而 “web” 将是服务的名称。

  1. 在 CloudShell 中新创建的选项卡中,通过输入以下命令,从 GitHub 克隆一个 Python Hello World 示例应用程序存储库。
git clone https://github.com/elastic/observability-examples
  1. 通过运行以下命令,将目录更改为 Hello World Web 应用程序代码的位置
cd observability-examples/aws/app-runner/helloworld
  1. 从应用程序的目录中构建 Hello World 示例应用程序。在 CloudShell 中运行以下 Docker 命令。
sudo docker build -t elastic-helloworld/web .
  1. 标记应用程序镜像。在下面的 Docker 命令中,将 <account_id> 替换为您的 AWS 账户 ID,然后在 CloudShell 中运行它。
sudo docker tag elastic-helloworld/web:latest <account_id>.dkr.ecr.us-east-2.amazonaws.com/elastic-helloworld/web:latest
  1. 将应用程序镜像推送到 ECR。在下面的命令中,将 <account_id> 替换为您的 AWS 账户 ID,然后在 CloudShell 中运行它。
sudo docker push <account_id>.dkr.ecr.us-east-2.amazonaws.com/elastic-helloworld/web:latest

将 Hello World Web 应用程序部署到 AWS App Runner

我们将使用 AWS App Runner 控制台执行将 Python Hello World 应用程序部署到 App Runner 的过程。

  1. 打开 App Runner 控制台,然后单击创建 App Runner 服务按钮。

  1. 在“源和部署”页面上,设置以下部署详细信息
  • 在“源”部分中,对于“存储库类型”,选择容器注册表
  • 对于“提供商”,选择 Amazon ECR
  • 对于“容器镜像 URI”,选择浏览以选择我们之前推送到 AWS ECR 的 Hello World 应用程序镜像。
    • 在“选择 Amazon ECR 容器镜像”对话框中,对于“镜像存储库”,选择 “elastic-helloworld/web” 存储库。
    • 对于“镜像标签”,选择 “latest”,然后选择继续
  • 在“部署设置”部分,选择“自动”
  • 对于 ECR 访问角色,选择“创建新的服务角色”
  • 单击“下一步”

  1. 在“配置服务”页面上的“服务设置”部分,输入服务名称“helloworld-app”。保留所有其他设置不变,然后单击“下一步”

  1. 在“检查并创建”页面上,单击“创建并部署”

几分钟后,Hello World 应用程序将部署到 App Runner。

  1. 单击“默认域” URL 以查看在 App Runner 中运行的 Hello World 应用程序。

使用 Elastic 可观测性工具检测 Hello World Web 应用程序

Web 应用程序在 App Runner 中成功运行后,我们现在可以添加最少的代码来开始监视应用程序。要在 Elastic Cloud 中启用 Hello World 应用程序的可观测性,我们将在 AWS CloudShell 中执行以下五个步骤。

  1. 编辑 Dockerfile 文件,以添加以下 Elastic Open Telemetry 环境变量,以及安装和运行 Elastic APM 代理的命令。键入“nano Dockerfile”来使用“nano”文本编辑器。请务必将 <ELASTIC_APM_SERVER_URL> 文本和 <ELASTIC_APM_SECRET_TOKEN> 文本替换为在之前的步骤中复制和保存的 APM 服务器 URL 和 APM 密钥令牌值。更新后的 Dockerfile 应如下所示
FROM python:3.9-slim as base

# get packages
COPY requirements.txt .
RUN pip install -r requirements.txt

WORKDIR /app

# install opentelemetry packages
RUN pip install opentelemetry-distro opentelemetry-exporter-otlp
RUN opentelemetry-bootstrap -a install

ENV OTEL_EXPORTER_OTLP_ENDPOINT='<ELASTIC_APM_SERVER_URL>'
ENV OTEL_EXPORTER_OTLP_HEADERS='Authorization=Bearer%20<ELASTIC_APM_SECRET_TOKEN>'
ENV OTEL_LOG_LEVEL=info
ENV OTEL_METRICS_EXPORTER=otlp
ENV OTEL_RESOURCE_ATTRIBUTES=service.version=1.0,deployment.environment=production
ENV OTEL_SERVICE_NAME=helloworld
ENV OTEL_TRACES_EXPORTER=otlp

COPY . .
ENV FLASK_APP=helloworld
ENV FLASK_RUN_HOST=0.0.0.0
ENV FLASK_RUN_PORT=8080
EXPOSE 8080
ENTRYPOINT [ "opentelemetry-instrument", "flask", "run" ]

注意:可以通过键入“Ctrl + x”来关闭 nano 文本编辑器并保存文件。按“y”键,然后按“Enter”键以保存更改。

  1. 编辑 helloworld.py 文件,以添加可观测性跟踪。在 CloudShell 中,键入“nano helloworld.py”以编辑该文件。
  • 在该文件顶部的 import 语句之后,添加初始化 Elastic Open Telemetry APM 代理所需的代码。
from opentelemetry import trace
tracer = trace.get_tracer("hello-world")
  • 替换“Hello World!”输出代码 . . .
return "<h1>Hello World!</h1>";
  • … 替换为 Hello Elastic 可观测性代码块。
return '''
<div style="text-align: center;">
<h1 style="color: #005A9E; font-family:'Verdana'">
Hello Elastic Observability - AWS App Runner - Python
</h1>
<img src="https://elastic-helloworld.s3.us-east-2.amazonaws.com/elastic-logo.png">
</div>
'''
  • 然后在 Hello Elastic 可观测性代码块之前添加一个“hi”跟踪,并在之后添加一个额外的“@app.after_request”方法来实现“bye”跟踪。
@app.route("/")
def helloworld():
	with tracer.start_as_current_span("hi") as span:
  	  logging.info("hello")
  	  return '''
   	 <div style="text-align: center;">
   	 <h1 style="color: #005A9E; font-family:'Verdana'">
   	 Hello Elastic Observability - AWS App Runner - Python
   	 </h1>
   	 <img src="https://elastic-helloworld.s3.us-east-2.amazonaws.com/elastic-logo.png">
   	 </div>
   	 '''

@app.after_request
def after_request(response):
	with tracer.start_as_current_span("bye"):
  	  logging.info("goodbye")
  	  return response

完成的 helloworld.py 文件应如下所示

import logging
from flask import Flask

from opentelemetry import trace
tracer = trace.get_tracer("hello-world")

app = Flask(__name__)

@app.route("/")
def helloworld():
    with tracer.start_as_current_span("hi") as span:
   	 logging.info("hello")
   	 return '''
    	<div style="text-align: center;">
    	<h1 style="color: #005A9E; font-family:'Verdana'">
    	Hello Elastic Observability - AWS App Runner - Python
    	</h1>
    	<img src="https://elastic-helloworld.s3.us-east-2.amazonaws.com/elastic-logo.png">
    	</div>
    	'''

@app.after_request
def after_request(response):
    with tracer.start_as_current_span("bye"):
   	 logging.info("goodbye")
   	 return response

注意:可以通过键入“Ctrl + x”来关闭 nano 文本编辑器并保存文件。按“y”键,然后按“Enter”键以保存更改。

  1. 使用 Docker 在应用程序目录中重新构建更新后的 Hello World 示例应用程序。在 CloudShell 中运行以下命令。
sudo docker build -t elastic-helloworld/web .
  1. 使用 Docker 标记应用程序映像。在下面的 Docker 命令中,将 <account_id> 替换为您的 AWS 账户 ID,然后在 CloudShell 中运行它。
sudo docker tag elastic-helloworld/web:latest <account_id>.dkr.ecr.us-east-2.amazonaws.com/elastic-helloworld/web:latest
  1. 将更新后的应用程序映像推送到 ECR。在下面的 Docker 命令中,将 <account_id> 替换为您的 AWS 账户 ID,然后在 CloudShell 中运行它。
sudo docker push <account_id>.dkr.ecr.us-east-2.amazonaws.com/elastic-helloworld/web:latest

将映像推送到 ECR 将自动部署新版本的 Hello World 应用程序。

打开 App Runner 控制台。几分钟后,Hello World 应用程序将部署到 App Runner。单击“默认域” URL 以查看在 App Runner 中运行的更新后的 Hello World 应用程序。

观察 Hello World Web 应用程序

现在我们已经检测了 Web 应用程序,以便将可观测性数据发送到 Elastic 可观测性工具,我们现在可以使用 Elastic Cloud 来监视 Web 应用程序的操作。

  1. 在 Elastic Cloud 中,选择“可观测性”“服务”菜单项。

  2. 单击 helloworld 服务。

  3. 单击“事务”选项卡。

  4. 向下滚动并单击“/”事务。

  5. 向下滚动到“跟踪示例”部分,以查看 “/”、“hi”“bye” 跟踪示例。

可观测性实现规模化

您已经了解了将 Web 应用程序部署到 AWS App Runner 的完整过程,该 Web 应用程序已通过 Elastic 可观测性工具检测。最终结果是,Web 应用程序将随着使用量的增加而扩展,并结合使用可观测性工具来监视 Web 应用程序,使其可以服务一个用户或数百万用户。

现在您已经了解了如何部署通过可观测性工具检测的无服务器 Web 应用程序,请访问 Elastic 可观测性,以了解有关如何为您的应用程序实施完整可观测性解决方案的更多信息。或者访问 Elastic on AWS 入门,以获取更多示例,了解如何通过将 AWS 的云计算服务与 Elastic 的搜索驱动平台相结合,来推动您所需的数据洞察。

本帖子中描述的任何特性或功能的发布和时间安排由 Elastic 自行决定。任何当前不可用的特性或功能可能不会按时或根本不交付。

分享这篇文章