✨
GoのHTTPSなAPIサーバーをデプロイする
FargateやらALBやらを使って結構料金のかかるインフラ設計にしている人が結構いるので今回はコスパの良いHTTPSなAPIサーバーを立てていきます。 * 完全に個人開発向けの話になります。
使用するサービス | |
---|---|
サーバー | ECS on EC2 |
ドメインの取得 | freenom |
DNS登録 | AWS Route53 |
SSLの証明書 | Let's Encrypt |
インフラ管理 | Terraform |
ドメインの取得
以下のサイトに従ってドメインを取得しましょう。
取得できたら以下のように表示されます。
Terraformの初期化
今回はサクッと終わらせるためにTerraformを使います。以下のリポジトリをcloneしてきてもらっても大丈夫です。
作業環境に移動する。
cd golang-ssl-server/terraform
Terraformの初期化をします。
terraform init
ECRへDockerイメージをPush
はじめにECRリポジトリのみを作成します。
terraform apply -target={aws_ecr_repository.ecr_repository,aws_ecr_lifecycle_policy.ecr_lifecycle_policy}
ECRへのDockerイメージのPushは以下を参考にしてください。
task-definitionの書き換え
ECRにPushしたイメージURIをコピーしてTerraformに貼り付けてください。
ecs.tf
resource "aws_ecs_task_definition" "task_definition" {
container_definitions = jsonencode(
[
{
cpu = 0
essential = true
image = "< イメージURI >"
Route53の設定
www.ymktmk.ga は自分が取得したドメインに置き換えてください。
route53.tf
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化を行ってくれます。
main.go
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
Elastic IPの関連付け
ECSの場合はAuto Scalingでインスタンスが増減するようになっている(今回はTerraformでmax1台の設定にしている)のでTerraformでは関連づけることはできない。したがって起動したインスタンスにElastic IPの関連付けを手動で行います。
freenomのDNS設定をします。
Route53のNSレコードが4件作成されるのでfreenomのNameserversの1~4に貼り付ける。
完成
以下のように表示されたらSSL化されたAPIサーバーの完成です。
参考文献
Discussion