yikegaya’s blog

仕事関連(Webエンジニア)と資産運用について書いてます

public access可能なRDSをterraformで作成した時のメモ

実運用ではダメだけどちょっと試したいことがあってpublic access可能なRDSをterraformで作った時のメモ

必要なこと

  • RDSのpublicly_accessibleをtrueにする
  • VPCのenable_dns_supportとenable_dns_hostnamesをtrueにする
  • RDSに紐づいているsubnetのaccessをpublicにする

public accessできないterraformとのdiff

git diff
diff --git a/rds.tf b/rds.tf
index 1aaca8b..49f41a0 100644
--- a/rds.tf
+++ b/rds.tf
@@ -15,4 +15,5 @@ resource "aws_db_instance" "movie-backend" {
   port                    = 3306
   vpc_security_group_ids  = [aws_security_group.movie-backend-rds-sg.id]
   db_subnet_group_name    = aws_db_subnet_group.movie-backend-db-subnet.name
+  publicly_accessible     = true
 }
diff --git a/subnet_group.tf b/subnet_group.tf
index 1c329c8..b4d8a70 100644
--- a/subnet_group.tf
+++ b/subnet_group.tf
@@ -1,4 +1,4 @@
 resource "aws_db_subnet_group" "movie-backend-db-subnet" {
   name        = "movie-rds-subnet-group"
-  subnet_ids  = [aws_subnet.movie-backend-private-1a.id, aws_subnet.movie-backend-private-1c.id, aws_subnet.movie-backend-private-1d.id]
+  subnet_ids  = [aws_subnet.movie-backend-public-1a.id, aws_subnet.movie-backend-public-1c.id, aws_subnet.movie-backend-public-1d.id]
 }
diff --git a/vpc.tf b/vpc.tf
index 6365c63..79f2602 100644
--- a/vpc.tf
+++ b/vpc.tf
@@ -1,5 +1,7 @@
 resource "aws_vpc" "movie-backend" {
   cidr_block = "10.0.0.0/16"
+  enable_dns_support   = true
+  enable_dns_hostnames = true

   tags = {
     Name = "movie-backend"

document.execCommandの代替(クリップボードへのコピー)

javascriptでdocument.execCommandを使ってクリップボードにテキストをコピーしているプログラムがあったんだけど最近のブラウザだとこのメソッド使えないらしく代わりになるものを探した。

クリップボードAPIってものがあってこっちを使えばいいらしい。クリップボードへのコピーの方法雑にググると現時点でdocument.execCommandが先に出てくる。

developer.mozilla.org

const target = document.getElementById('hoge')
target.readOnly = false;
const range = document.createRange();
range.selectNode(target);
window.getSelection().addRange(range);
document.execCommand('copy');
target.readOnly = true;

navigator.clipboard.writeText(value)

ただIEの場合はwindow.clipboardData使わないとダメかも

    if (window.clipboardData){
      window.clipboardData.setData("Text" , target.value);
    }

ブラウザごとの対応状況

developer.mozilla.org

terraformで AWS acmの取得、破棄を繰り返してたら上限超えたので緩和申請した

httpsを使いたくてterraformからAWS Certificate ManagerでSSL/TLS 証明書を発行してたんだけど使ってる個人AWSアカウントだと上限が10だったらしくてterraform applyとdestroyを繰り返してたら超えて発行できなくなってしまった。

対応

AWSのサポートセンターのページを開いて、Limit typeでAWS Certificate Managerを選択→上限30で申請出したら4日で返信きて上限緩和された。

上限30で申請出したけどなんか一気に1000に上げてくれた。割と最近作ったアカウントだと上限低かったらしい。

ECS環境に必要な最小限のリソース

ECS用のterraform思っていろいろ調べたりいじったりしてみたんだけど、AWSのいろんなサービスと絡んでいて最低限必要なリソースがよくわからないのでまとめてみる。

とりあえずterraformでECS環境構築してnginxにブラウザからアクセスできるところまでやってみたけど結局terraformの以下resource用意すれば良いのかな。

ネットワーク周り

ECS関連

  • aws_ecs_cluster
  • aws_ecs_service
  • aws_ecs_task_definition

ロードバランサ関連

  • aws_lb_target_group
  • aws_lb_listener
  • aws_lb_listener_rule

ElastipIP

こう見るととりあえず動かすならEC2と同じでネットワーク作る作業が一番重い感じかな。。

この先本格的に使おうと思うとECS上でのCI/CD作ろうとかhttps用に証明書発行しようとかロギングとかでややこしくなるかもしれないけどとりあえずECSそのものの負担は少ないかも。

参考にしたハンズオン ECS - Terraformで構築するAWS

最近読んだ技術書

エリック・エヴァンスのドメイン駆動開発

ずっと積読になってたのをやっと読んだ。

技術だけ追ってても完成度の高いソフトウェアを作るのは厳しくてドメイン知識を開発に落とし込む努力が必要。ってのが500ページ以上使って実例を交えて紹介されている。著者が経験豊富なエンジニアでうまくいったプロジェクトとうまくいかなかったプロジェクトの分析をしていてその辺りが興味深かった。

Kubenetes完全ガイド

Kubenetesは今のところ仕事では使ってないけど流行ってるしこれからも普及しそうな気配があるので首を突っ込んでおこうと思って読んでいる。 これは一周読んだけどもう何度か読み返す必要がありそう。

ECSだといろんなAWSのサービスを使ってルーティングやデプロイやロードバランシングができるけどKubenetesだとその辺りをKubenetes内の仕組みで完結させられるっていうのはなんとなくわかってきたけどまだもう少し読み込む必要ありそう。

実践Terraform

Terraform触ってみて一応ネットの記事読みながらでも結構使えそうなんだけど結構多機能でできること多いのでまとまった情報源が欲しくて読んでみた。

Goならわかるシステムプログラミング

普段の仕事がフロントエンド作ったりAPI作ったりテーブル設計したりっていうWEBサービスの開発なんでいつもより低いレイヤーの知識が得られて面白かった。構造体や並行プログラミングにも詳しく触れられていてGoの勉強にもなる。

ただ本格的なシステムプログラミングをするならやっぱりC、C++、Rustじゃないと厳しい場面も多いみたい。

GoでDBの接続情報をyamlに切り出した時のメモ

Goで作ったサービスで環境ごとにDBの接続先を切り替えたいと思ってこんな感じ↓でyamlに書いた接続情報を読み込んだ時のメモ。

driver: mysql
development:
  user: root
  password: "pass"
  protocol: "tcp(movie_mysql:3306)"
  db_name: "movie_info"

これがベストかいまいちわからないんだけど割と面倒なコードになった。

// まずgopkgからライブラリを読み込む
import (
    "gopkg.in/yaml.v2"
)
 bufとしてyamlを読み込む
  buf, err := ioutil.ReadFile("/workspace/golang_backend/db/db_connect.yml")
  if err != nil {
      log.Fatal(err)
  }

  var m map[string]interface{}
 // yamlをmap形式に変換
  err = yaml.Unmarshal([]byte(buf), &m)
  if err != nil {
      log.Fatal(err)
  }

  DBMS     := "mysql"
  USER     := m["development"].(map[interface {}]interface {})["user"].(string)
  PASS     := m["development"].(map[interface {}]interface {})["password"].(string)
  PROTOCOL := m["development"].(map[interface {}]interface {})["protocol"].(string)
  DBNAME   := m["development"].(map[interface {}]interface {})["db_name"].(string)

ネストした値はmap[interface {}]interface {}といった型になっているらしくその型でとってきてさらにstringに直さないと使えなかった。

普段Rubyとか使ってるとドットでつなげば取れるんで違和感強いけど、Goとかシステムプログラミング言語(C++とかRust)書いてる人からすればこういうもんでしょ。って感じなのだろうか。

ポートフォリオのデプロイどうするか考えた

ポートフォリオ(Next.js+Goの映画情報提供Webサービス)作ったは良いけどローカルで動作確認しただけで実際公開するところまではやってなかった。

けど、せっかくだしインフラ作ってコード化するところまでやってしまおうかと思った時にどの技術を使うかを考えてみた。

Next.jsのデプロイ

これはまあVertifyに置いとけば良いかな。使ってみたけどUIがめっちゃ快適でほとんど何も調べずにデプロイできた。GithubのアカウントとVertifyのアカウントを同期してレポジトリを選択して環境変数だけ設定すればデプロイしてくれて引くほど楽だった。

なので以下はGoで作ったバックエンドAPIのデプロイの設定の話。

AWS or GCP

これはとりあえずAWSで。GCP触ったことないしなんだかんだで求人みてもAWS多そうなんで引き続きAWSに習熟する方向で経験積もうかと。

terraform or CloudFormation

どっちも軽く触ってみたけどterraformの方が快適そう。

workspaceって概念で同じコードからproduction、staging、sandboxなどいろんな環境を作れるしLintやrbenvみたいな言語のバージョン管理の仕組みがあったり、実行前の確認やモジュール分割ができたりで良い感じ。

CloudFormationはAWSの公式だしこっちでも良いんだけど、ひたすらYAMLを書いていく作業が辛そうだった。

ECS or EKS

EKS(kubenetes)の方ができること多いんだけどとりあえずシンプルで敷居の低そうなECSでやってみようと思う。ECSで一通りのことができるようになったらEKSも挑戦したい。

EC2 or Fagate

これはまあ切り替えるのそんなに難しくなさそうだけど時代はFagateなのかな。。FagateはSSHでコンソールに入れないのできちんとログを取らないとデバッグそう。

CI/CD

これはあんまり決めてない。CircleCIしか体験したことないけどAWSのマネージドサービスでやっちゃっても良いのかな。。

今後

上記のこと考えてterraform書き始めたけど結構やること多くて時間かかりそうな。。一応EC2を使ったシンプルな構成のデプロイ設定はやったことあるはずなんだけどterraformとコンテナのデプロイに慣れてなくて壁に当たりまくっている。