AWS App Runner 是一项完全托管的服务,使开发人员能够快速大规模地部署容器化 Web 应用程序和 API,而无需具备基础设施经验。您可以从源代码或容器映像开始。

这篇文章将向您展示如何使用 AWS App Runner 部署容器化应用程序。为此,我们将使用 Terraform 将一个简单的容器化 Python 应用程序部署到 AWS Runner。首先,我们将学习如何创建 Terraform AWS Provider,然后使用 Terraform 将一个简单的应用程序部署到我们的 AWS App Runner Service,最后,我们将拥有一个与公共端点一起工作的简单应用程序。

先决条件

在开始本教程之前,您需要以下内容:

  • 一个 AWS 账户(您可以在这里免费创建一个)

  • 在本地安装 Terraform 或者使用 AWS Cloud Shell,然后安装 Terraform;我在这里写了一篇关于如何做到这一点的文章

  • 您选择的文本编辑器(我的建议是VS Code)

第一步:安装 Terraform

要安装 Terraform,请导航到Terraform 学习页面并根据您首选的操作系统按照说明进行操作。

要验证它是否已正确安装,您可以进行版本检查:

terraform version

进入全屏模式 退出全屏模式

如果安装成功,您将看到如下输出:

Terraform v1.2.5
on darwin_arm64

进入全屏模式 退出全屏模式

安装好 terraform 并准备好使用后,您需要通过在此处生成 API 访问密钥并配置 Terraform 来为您的用户账户配置 AWS 凭证。有很多方法可以做到这一点,但最简单的方法之一是将AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY设置为环境变量:

export AWS_ACCESS_KEY_ID=(your access key id)
export AWS_SECRET_ACCESS_KEY=(your secret access key)

进入全屏模式 退出全屏模式

第 2 步:配置 Terraform 块和 AWS Terraform Provider

接下来要做的是将 Terraform 配置为使用 AWS 提供程序进行配置。您需要在为项目创建的目录中创建一个名为main.tf的文件。对于这个项目,我创建了一个名为terraform-apprunner的目录,它将作为您的工作目录。

在 main.tf 文件中,您首先需要定义将用于配置的提供程序。

一旦我们定义了我们的提供者,我们将需要在我们的初始配置中定义三个资源。

terraform {
  required_providers {
    aws = {
      source = "hashicorp/aws"
      version = "4.22.0"
    }
  }
}

# Configure the AWS Provider
provider "aws" {
  region = "eu-west-1"
}

进入全屏模式 退出全屏模式

添加到我们刚才所做的:在 terraform 块中,我们需要一个 AWS 提供商。 Terraform 依赖称为“提供者”的插件与云提供商(如 AWS)进行交互,因为这正是我们正在使用的。

Provider Block:这会通知 Terraform 您将使用 AWS 提供商并希望在 eu-west-1 区域部署您的基础设施。

第二步:添加App runner资源块

有趣的部分来了!让我们将我们的 App runner 服务添加到main.tf

resource "aws_apprunner_service" "hello" {                            
  auto_scaling_configuration_arn = aws_apprunner_auto_scaling_configuration_version.hello.arn                          

  service_name = "hello-app-runner"                          

  source_configuration {                              
    image_repository {                                
      image_configuration {                                  
        port = "8000" #The port that your application listens to in the container                             
      }                                

      image_identifier = "public.ecr.aws/aws-containers/hello-app-runner:latest"                                
      image_repository_type = "ECR_PUBLIC"                              
    }                          

  }                          
}
output "apprunner_service_hello" {                            
  value = aws_apprunner_service.hello                          
}

进入全屏模式 退出全屏模式

现在让我解释一下上面的代码块是做什么的。

resource:资源块描述一个或多个基础设施对象,例如虚拟网络。接下来是资源的类型,名称。

service_name:服务名称。

source_configuration:要部署到 App Runner 服务的源。它可以是代码存储库或图像存储库。我们在 AWS ECR(弹性容器注册表)上使用了一个公共镜像。截至撰写本文时,Apprunner 仅支持来自 Private 和 Public ECR 的容器镜像。

output:输出变量在构建配置时非常有用。输出值类似于函数返回值。

第 3 步:应用我们的配置

首先,我们初始化我们的工作目录以下载项目插件。命令是:

terraform init

进入全屏模式 退出全屏模式

默认情况下,提供程序代码下载到根目录下的 .terraform 文件夹中(您可能希望将其添加到 .gitignore)

现在您已经下载了提供程序代码,运行 terraform plan 命令:

terraform plan

进入全屏模式 退出全屏模式

terraform plan命令可让您在执行之前预览 Terraform 将提供的内容。

现在是时候应用更改并在 App runner 上启动您的容器化应用程序了。

terraform apply

进入全屏模式 退出全屏模式

这将向您显示相同的计划输出,并要求您与Yes确认是否要继续执行此计划。确认后,应用配置需要几分钟,您将看到 Terraform 打印出以下内容:

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Outputs:

apprunner_service_hello = {
  "arn" = "arn:aws:apprunner:eu-west-1:790783553687:service/terra-app-runner/8fbcddbda2e34cbcb48befbd9ef30632"
  "auto_scaling_configuration_arn" = "arn:aws:apprunner:eu-west-1:790783553687:autoscalingconfiguration/DefaultConfiguration/1/00000000000000000000000000000001"
  "encryption_configuration" = tolist([])
  "health_check_configuration" = tolist([
    {
      "healthy_threshold" = 1
      "interval" = 5
      "path" = "/"
      "protocol" = "TCP"
      "timeout" = 2
      "unhealthy_threshold" = 5
    },
  ])
  "id" = "arn:aws:apprunner:eu-west-1:790783553687:service/terra-app-runner/8fbcddbda2e34cbcb48befbd9ef30632"
  "instance_configuration" = tolist([
    {
      "cpu" = "1024"
      "instance_role_arn" = ""
      "memory" = "2048"
    },
  ])
  "service_id" = "8fbcddbda2e34cbcb48befbd9ef30632"
  "service_name" = "terra-app-runner"
  "service_url" = "ajxqmh7ehq.eu-west-1.awsapprunner.com"
  "source_configuration" = tolist([
    {
      "authentication_configuration" = tolist([])
      "auto_deployments_enabled" = false
      "code_repository" = tolist([])
      "image_repository" = tolist([
        {
          "image_configuration" = tolist([
            {
              "port" = "8000"
              "runtime_environment_variables" = tomap(null) /* of string */
              "start_command" = ""
            },
          ])
          "image_identifier" = "public.ecr.aws/aws-containers/hello-app-runner:latest"
          "image_repository_type" = "ECR_PUBLIC"
        },
      ])
    },
  ])
  "status" = "RUNNING"
  "tags" = tomap(null) /* of string */
  "tags_all" = tomap({})

进入全屏模式 退出全屏模式

第 4 步:测试我们的应用程序

现在我们已经完成了这些步骤,是时候在 App runner 上测试配置的 App了。查找输出的 service_url 部分。你会看到这样的东西:

service_url = bg2hcjuckx.us-east-1.awsapprunner.com

进入全屏模式 退出全屏模式

复制 service\url 的值并在浏览器中尝试;您应该会看到类似于下面的屏幕截图的内容。

屏幕截图 2022-07-22 at 21.45.07.png

恭喜!我们已经在 App runner 上成功部署了一个容器化的应用程序。请注意,当您阅读本文时,上面的service _url可能不可用。

参考

您可能会发现这些资源很有帮助。

  • AWS 应用程序运行器

  • AWS 应用程序运行器常见问题解答

感谢您阅读,并记得注册我的时事通讯,以便在我发布新文章时成为第一个学习的人。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐