移転しました。
後学と好奇心と実験のために移転しました。 izayoi.link
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)
いやぁそれにしても良いソフトに出会った。