at forty — Blog

3月15日 - 作業備忘録

目的

  • 自前の MacBook Air (2018) が非力なため、開発環境として心許ない。
  • Web サーバーとして ConoHa を借りているが、常時必要なわけではなく、費用を抑えておきたい。
  • ConoHa + Terraform を使って、簡単に apply / destroy できる環境を整える。

実施したこと

開発環境のセットアップ

  • hashicorp/terraform の Dev Container をセットアップした。
    • コンテナイメージ hashicorp/terraform を GitHub にて確認したところ Alpine Linux であったため、postCreateCommandapt-get から apk に変更した。
    • apk にて curl コマンドをインストールし、Terraform の設定時に利用する OS イメージの一覧を取得するスクリプト (get_imagelist.sh) を作成した。
    • OS の SSH 鍵を設定するために mk_key.sh も合わせて作成した。

Terraform 設定

以下の記事を参考に、Boot Volume・Security Group・SSH Key を設定し、Compute Instance を作成する Terraform 設定を行った。

参考記事: https://developers.gmo.jp/technology/47155/

ポイント1: 認証情報の管理

terraform.tfvars にパスワードなどの情報を集約した上で、.gitignore にてファイルがリポジトリにアップロードされないよう設定した。

conoha_v3_auth_url    = "https://identity.c3j1.conoha.io/v3"
conoha_v3_tenant_name = "XXXXXXXXXXXX"
conoha_v3_user_name   = "XXXXXXXXXXXX"
conoha_v3_password    = "XXXXXXXXXXXX"

ポイント2: Security Group への IP アドレス制限の追加

Security Group のモジュールに remote_ip_prefix を追加し、接続元 IP アドレスによるアクセス制限を設けた。

修正前

resource "openstack_networking_secgroup_rule_v2" "secgroup_rule" {
  count             = length(var.rules)
  direction         = var.rules[count.index].direction
  ethertype         = var.rules[count.index].ethertype
  protocol          = var.rules[count.index].protocol
  port_range_min    = var.rules[count.index].port_range_min
  port_range_max    = var.rules[count.index].port_range_max
  security_group_id = openstack_networking_secgroup_v2.secgroup.id
}

修正後

resource "openstack_networking_secgroup_rule_v2" "secgroup_rule" {
  count             = length(var.rules)
  direction         = var.rules[count.index].direction
  ethertype         = var.rules[count.index].ethertype
  protocol          = var.rules[count.index].protocol
  port_range_min    = var.rules[count.index].port_range_min
  port_range_max    = var.rules[count.index].port_range_max
  remote_ip_prefix  = var.rules[count.index].remote_ip_prefix
  security_group_id = openstack_networking_secgroup_v2.secgroup.id
}