13
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

docker-composeで作ったgoサーバーを雑にawsのec2にデプロイする

Last updated at Posted at 2020-05-14

はじめに

以前docker-composeで作成したgoサーバを簡易的にデプロイする必要があるタイミングがあったのですが、いい感じにハマりまくって地獄を見たのでとりあえずでawsにデプロイする方法を簡単にまとめておきたいと思います

ローカルでdocker-composeで動くgoサーバを作る

まずはソースツリーから、、、

test-docker
│ 
├── docker
│   ├── app
│   │   └── Dockerfile
│   └── db
│       └── conf.d
│           └── mysql.conf
├── docker-compose.yml
├── go.mod
├── go.sum
├── main.go
└── models
    └── init.go

Docker周り

docker/app/Dockerfile
FROM golang:latest
RUN mkdir test-docker
WORKDIR /test-docker

RUN apt-get update \
  && apt-get install -y mariadb-client

COPY . .

RUN CGO_ENABLED=0 go build -o main main.go

CMD ["./main"]

docker/db/conf.d/mysql.conf
[mysqld]
character-set-server=utf8mb4
explicit-defaults-for-timestamp=1
general-log=1
general-log-file=/var/log/mysql/mysqld.log

[client]
default-character-set=utf8mb4

docker-compose.yml
version: "3"
services:
  app:
    build:
      context: .
      dockerfile: ./docker/app/Dockerfile
    container_name: test-docker-app
    volumes:
      - .:/go/src/test-docker
    ports:
      - "80:8080"
    depends_on:
      - mysql
    restart: always
  mysql:
    image: mysql:8.0
    restart: always
    container_name: test-docker-db
    environment:
      MYSQL_USER: root
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: test
    hostname: mysql
    ports:
      - "3306:3306"
    volumes:
      - ./docker/db/conf.d:/etc/mysql/conf.d
      - ./log/mysql:/var/log/mysql

goサーバー

main.go
package main

import (
	"test-docker/models"

	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})

	r.GET("/products", func(c *gin.Context) {
		var product models.Product

		models.DB.First(&product, 1)
		c.JSON(200, product)
	})
	r.Run()
}

models/init.go
package models

import (
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

type Product struct {
	gorm.Model
	Code  string
	Price uint
}

var DB *gorm.DB

func init() {
	var err error

	DB, err = gorm.Open("mysql", "root:password@tcp(test-docker-db:3306)/test?charset=utf8&parseTime=True&loc=Local")
	if err != nil {
		panic(err)
	}

	// スキーマのマイグレーション
	DB.AutoMigrate(&Product{})

	// Create
	DB.Create(&Product{Code: "L1212", Price: 1000})

	// Read
	var product Product
	DB.First(&product, 1)
}

ターミナル
$ go mod init
go: creating new go.mod: module test-docker

以上で準備完了

ターミナル
$ docker-compose up

ec2インスタンスを立てる

  1. awsのec2ダッシュボードに行く
スクリーンショット 2020-05-13 14.37.30.png
  1. インスタンス作成ボタンを押す
スクリーンショット 2020-05-13 14.37.45.png
  1. Linuxを選択
スクリーンショット 2020-05-13 14.38.03.png
  1. t2.microを選択
スクリーンショット 2020-05-13 14.38.18.png
  1. インスタンスの詳細設定で、「自動割り当てパブリックIP」を「無効」→「有効」に変更し次へ
スクリーンショット 2020-05-13 14.38.33.png
  1. ストレージ追加 >> タグの追加 という項目があるがデフォルトのまま次へを押す
  2. 「ルール追加」ボタンを押しタイプを「http」に変更次へを押す(httpでのリクエストを受け付ける様にしています)
スクリーンショット 2020-05-13 14.54.08.png
  1. 確認画面が出るのでそのまま次へ
スクリーンショット 2020-05-13 14.39.09.png
  1. 「新しいキーペアを作成」しキーペアをダウンロード >> 「インスタンスの作成」を押す
スクリーンショット 2020-05-13 14.40.15.png
  1. 作成されたインスタンスを確認し「IPv4 パブリック IP」という項目のIPアドレスをコピーしておく
スクリーンショット 2020-05-13 15.13.00.png
  1. 起動したec2インスタンスにsshする
ターミナル
$ mv ~/Downloads/test-docker.pem ~/.ssh
$ chmod 400 ~/.ssh/test-docker.pem
$ sh -i ~/.ssh/test-docker.pem ec2-user@コピーしたIPアドレス

ec2インスタンスの環境構築

1.sshすると「本当につなげますか?」みたいなことが聞かれるので「yes」をタイピング

ターミナル
$ssh -i ~/.ssh/test-docker.pem ec2-user@13.231.224.154

〜省略〜

Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '13.231.224.154' (ECDSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
1 package(s) needed for security, out of 10 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-0-85 ~]$

2.docker, docker-composeをインストール

ターミナル(ec2内部)
# dockerのインストール
$ sudo yum install -y docker          
$ sudo service docker start           # dockerの起動
$ sudo usermod -a -G docker ec2-user  # ec2-userをdockerグループに入れる

# docker-composeのインストール
$ sudo curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

3.立ち上げたec2インスタンスに作成したファイルを送る

ターミナル(ローカル)
# ローカルのディレクトリを立ち上げたインスタンスのhomeディレクトリにコピー
$ scp -r -i ~/.ssh/test-docker.pem ../test-docker ec2-user@コピーしたIPアドレス:~/

# 改めてたちあげたインスタンスにssh
$ ssh -i ~/.ssh/test-docker.pem ec2-user@

確認する

1.dockerを立ち上げ

ターミナル(ec2内部)
$ cd test-docker # コピーしたディレクトリに移動

$ docker-compose up -d # バックグラウンドでdocker-composeを起動

$ docker ps # 正常に起動できてるかを確認
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
27042b2e038d        test-docker_app     "sh ./start.sh"          57 seconds ago      Up 55 seconds       0.0.0.0:80->8080/tcp                test-docker-app
6c820a45602e        mysql:8.0           "docker-entrypoint.s…"   57 seconds ago      Up 56 seconds       0.0.0.0:3306->3306/tcp, 33060/tcp   test-docker-db

2.ブラウザを起動し「コピーしたIPアドレス/products」で下記の様なレスポンスが返ってきたら成功です
スクリーンショット 2020-05-13 15.53.14.png

まとめ

本当に雑ですがとりあえずこんな感じで簡単にdocker-composeをデプロイすることができます
sshをマイIPに制限するとか、scpするんじゃなくてgithubからpullできる様にするとか、、、
というかそもそもfagate使うとかまあツッコミどころはいいろいろありますが、とりあえずデプロイしないといけない時はこんな感じで十分なのかなと思います。

参考文献

13
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?