在Go中部署一个经济实惠的API服务器

由于许多人使用Fargate、ALB等来构建昂贵的基础设施,因此这次我们将搭建性价比较高的HTTPS API服务器。*这完全是针对个人开发的话题。

使用するサービスサーバーECS on EC2ドメインの取得freenomDNS登録AWS Route53SSLの証明書Let’s Encryptインフラ管理Terraform

获取域名

根据以下网站的指南获取域名。

 

如果成功取得,将显示如下。

スクリーンショット 2022-04-30 16.51.58.png

对Terraform进行初始化

为了快速完成这次任务,我们将使用Terraform。您可以克隆以下存储库而不必担心。

 

切換到工作環境。

cd golang-ssl-server/terraform

进行Terraform的初始化。

terraform init

将Docker镜像推送到ECR

首先,只需创建一个ECR存储库。

terraform apply -target={aws_ecr_repository.ecr_repository,aws_ecr_lifecycle_policy.ecr_lifecycle_policy}

请参考以下内容推送Docker镜像到ECR。

スクリーンショット 2022-05-01 16.48.01.png

更改任务定义的编写

请复制已推送到ECR的映像URI并粘贴到Terraform中。

resource "aws_ecs_task_definition" "task_definition" {
    container_definitions    = jsonencode(
        [
            {
                cpu              = 0
                essential        = true
                image            = "< イメージURI >"

「对 Route53 进行配置」

请将 www.ymktmk.ga 替换为我所拥有的域名。

resource "aws_route53_zone" "zone" {
      name = "ymktmk.ga"
}

resource "aws_route53_record" "www" {
      zone_id = aws_route53_zone.zone.zone_id
      name    = "www.ymktmk.ga"
      type    = "A"
      ttl     = "300"
      # EC2インスタンスのPublic IP
      records = [aws_eip.eip.public_ip]
}

Go语言代码

本次我们使用了轻量级框架Echo。以下的简洁代码能够与Let’s Encrypt进行连接,并将其转换为SSL加密。

package main

import (
	"net/http"

	"github.com/labstack/echo/v4"
	"github.com/labstack/echo/v4/middleware"
	"golang.org/x/crypto/acme/autocert"
)

func main() {
	e := echo.New()
    // www.ymktmk.ga は取得したドメイン
	e.AutoTLSManager.HostPolicy = autocert.HostWhitelist("www.ymktmk.ga")
	e.AutoTLSManager.Cache = autocert.DirCache("/var/www/.cache")
	e.Use(middleware.Recover())
	e.Use(middleware.Logger())
	e.GET("/", func(c echo.Context) error {
		return c.String(http.StatusOK, "Hello, World!")
	})
	e.Logger.Fatal(e.StartAutoTLS(":443"))
}

部署

创建公钥和私钥。

ssh-keygen -t rsa -f golang-ssl-server -N ''

根据Terraform的配置将部署到AWS。

terraform apply

请将弹性IP进行关联

在ECS的情况下,由于使用了Auto Scaling来增减实例(本次使用Terraform设置为最大1台),因此无法通过Terraform进行关联。因此,需要手动将弹性IP与启动的实例关联起来。

スクリーンショット 2022-05-01 16.27.44.png

我将进行freenom的DNS设置。

创建4个Route53的NS记录,将其粘贴到freenom的Nameservers 1~4上。

スクリーンショット 2022-05-01 5.18.51.png
スクリーンショット 2022-05-01 2.14.08.png

完成

如果显示如下,则表示SSL化的API服务器已完成。

スクリーンショット 2022-05-01 16.50.45.png

参考文献的意思是引用其他人的著作、研究或资料来支持自己的观点。

 

bannerAds