技術雑記帳兼日記帳

AWS、Python、Terraformの使い方をコッソリ

terraform要素の配列化

Terraformのモジュール化の勉強ついでに、Subnetの複数定義をsplitの使用から配列での実装に変更して見たので比較してみます。

参考:ベストプラクティス github.com

→下記以外にモジュールの実装でかなり勉強になりました。

split使用版

variable "cidrs" { default = "192.168.1.0/24,192.168.2.0/24"} 
variable "azs" { dedefault = "ap-northeast-1a,ap-northeast-1c"}
  
resource "aws_subnet" "private_subnet" {
  vpc_id            = var.vpc_id
  cidr_block        = element(split(",", var.cidrs), count.index)
  availability_zone = element(split(",", var.azs), count.index)
  count             = length(split(",", var.cidrs))
 :
 :
}

output "subnet_ids" { value = join(",", aws_subnet.private_subnet.*.id) }

cidrやazをカンマ区切り文字列で渡している。

outputも同様にカンマ区切りで生成したサブネットのIDを返却する。

使う側はsplit(",", subnet_ids)して配列にしてあげれば良い。

split未使用版

variable "private_networks" {
  default = {
    "cidrs" = ["192.168.3.0/24", "192.168.4.0/24"]
    "azs"   = ["ap-northeast-1a", "ap-northeast-1c"]
  }
}
 
resource "aws_subnet" "private_subnet" {
  vpc_id            = var.vpc_id
  cidr_block        = element(var.private_networks.cidrs, count.index)
  availability_zone = element(var.private_networks.azs, count.index)
  count             = length(var.private_networks.cidrs)
  :
  :
}


output "subnet_ids" { value = [for sbunet in aws_subnet.private_subnet : sbunet.id] }

こっちはmapでcidersやaszを切って、その配列をelementで取り出してあげて、最後にforループでidを取り出してidも配列にしている。

splitをかまさない分利用する側はシンプルに「=」だけで実装できる。

見た目のシンプル差で後者が良さそうだなぁ。

ちなみに下記は利用する側で使えなかった。

output "subnet_ids" { value = [aws_subnet.private_subnet.*.id] }

terraformのEBS暗号化

EBSの暗号化しているかしていないか気になるのであれば下記を指定することで、意識しなくても暗号化してくれるらしい。

resource "aws_ebs_encryption_by_default" "ebs_encryption_by_default" {
  enabled = true
}

当然ながら後からの場合は属性が変わるだけで暗号化はしてくれません。

AWS と Terraformで実現するInfrastructure as Code 受講完了

AWS と Terraformで実現するInfrastructure as Code | Udemy

これの受講が終わりました。

非常に素晴らしい内容ですのでIaCに興味がある方は受講をお勧めです。

以下、良かった点

  • ハンズオン形式でコードを実際に書いて、ちょこちょこ形にしていくので、コツコツできる。
  • 目に見えた成果物が作成できる。
  • RDS作成、AutoScalingグループの作成、S3バケットの作成などAWSでWebを作るときの主要機能も網羅している
  • ループなど、実際は使わなくても表現できる箇所を細かく解説してくれている。
  • IaCに抵抗感がなくなった。

AWS入門してアソシエイトをとったレベルの人間にはちょうど良い難度でした。

最後に詰まったところを列挙します。

ACMがCNAMEで承認できない時

 元々あるホストゾーンを使ってやったので、そのホストゾーンを消して作り直すとうまくいった。

MacのGPGが使えない

 terraform apply後に以下となる。

│ Error: error encrypting password during IAM User Login Profile (xxxx) creation: Error encrypting Password: error parsing given PGP key: openpgp: unsupported feature: unsupported oid: 2b060104019755010501
│ 
│   with aws_iam_user_login_profile.login_profile,
│   on iam_user.tf line 16, in resource "aws_iam_user_login_profile" "login_profile":
│   16: resource "aws_iam_user_login_profile" "login_profile" {

Homebrew経由でインストールしたgpgだと上手くいかなかった。

同じようにハマっていた方の案を使って、docker+ubuntu+gpgを使うことで問題なく進めることができました。

ちなみにデコード時に以下が出た時は、

gpg: public key decryption failed: Inappropriate ioctl for device
gpg: decryption failed: No secret key

以下を打ってあげるとシークレットキー入力までいけました。

export GPG_TTY=$(tty)

いやぁそれにしても良いソフトに出会った。

Terraformのコマンド

Terraformのコマンドで注意しなければいけないコマンドを挙げてみる。

terraform destroy

一生懸命コードを書いて、作り上げた環境が一発で吹っ飛ばせるのはちょっとしたカタルシス。。。

terraform apply -auto-approve

これはコンソールでインスタンスを停止して、このコマンド叩いたら、既存のインスタンスが終了して新しく作られた。

勢いで「-auto-approve」すると、いきなりインスタンスが終了して焦る。

身も蓋もないことを言えばむやみやたらと「-auto-approve」をすんな、確認しろってことだけど。

Terraform

AWSの勉強と一緒にTerraformもあわせて勉強しています。

面倒な設定を分けて記述して管理しやすく構造化できるため、ハンコ文字の如くインフラを増殖させることができるので、 新規開発をAWSでやりましょうとなったときに、ノウハウをそのまま移行できると感じています。

CloudFormationでも良いのですが、私的にはTerraformの方が読みやすく、リソース=単一リソースとも取れるので、パッとみたときにとっつきやすく 自分には向いていると感じています。

それもこれもUdemyのおかげです。 わかりやすい解説いつもお世話になってます。