Jonathan Simon

使用 AWS App Runner 部署 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 设置,下一步是为将应用部署到 App Runner 设置我们的 AWS 项目。

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。将<account_id>替换为下面的 Docker 命令中的 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. 标记应用程序镜像。将<account_id>替换为下面的 Docker 命令中的 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”存储库。
    • 对于 Image 标签,选择“最新”,然后选择继续
  • 在部署设置部分,选择自动
  • 对于 ECR 访问角色,选择创建新的服务角色
  • 点击下一步

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

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

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

  1. 点击默认域名 URL 查看在 App Runner 中运行的 Hello World 应用。

使用 Elastic 可观测性监控 Hello World Web 应用

在 App Runner 中成功运行 Web 应用后,我们现在准备添加启动应用监控所需的最小代码。为了在 Elastic Cloud 中启用 Hello World 应用的可观测性,我们将在AWS CloudShell中执行以下五个步骤

  1. 编辑 Dockerfile 文件以添加以下 Elastic Open Telemetry 环境变量以及安装和运行 Elastic APM 代理的命令。使用“nano”文本编辑器,键入“nano Dockerfile”。请务必将<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 Observability 代码块。
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 Observability 代码块之前添加一个“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”跟踪样本。

可扩展的可观测性

您已经看到了将使用 Elastic 可观测性监控的 Web 应用部署到 AWS App Runner 的完整过程。最终结果是一个 Web 应用,它可以根据使用情况进行扩展和缩减,并结合可观测性工具来监控 Web 应用,无论它为一个用户还是数百万用户提供服务。

既然您已经了解了如何部署带有可观测性监控的无服务器 Web 应用,请访问Elastic 可观测性以了解如何为您的应用实施完整的可观测性解决方案的更多信息。或者访问Elastic on AWS 入门指南,了解更多关于如何通过结合 AWS 的云计算服务和 Elastic 的基于搜索的平台来获得所需数据洞察的示例。

本文中描述的任何功能或功能的发布和时间安排完全由 Elastic 决定。任何当前不可用的功能或功能可能无法按时或根本无法交付。