在Go中部署一个经济实惠的API服务器
由于许多人使用Fargate、ALB等来构建昂贵的基础设施,因此这次我们将搭建性价比较高的HTTPS API服务器。*这完全是针对个人开发的话题。
使用するサービスサーバーECS on EC2ドメインの取得freenomDNS登録AWS Route53SSLの証明書Let’s Encryptインフラ管理Terraform
获取域名
根据以下网站的指南获取域名。
如果成功取得,将显示如下。

对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。

更改任务定义的编写
请复制已推送到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与启动的实例关联起来。

我将进行freenom的DNS设置。
创建4个Route53的NS记录,将其粘贴到freenom的Nameservers 1~4上。


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

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