Slide 1

Slide 1 text

IaC運用してみて感じた 素晴らしさとアンチパターン 黒野 雄稀 | 2022/9/25 1

Slide 2

Slide 2 text

自己紹介 黒野 雄稀 Yuki Kurono twitter:@kurono_98 Qiita :@kurono #jawsug #jawsdays #jawsdays2022 アイレット株式会社 エンタープライズクラウド事業部所属  2020/4 新卒入社 普段はインフラ設計・構築や運用構築に従事 2022 APN ALL AWS Certifications Engineers 2

Slide 3

Slide 3 text

#jawsug #jawsdays #jawsdays2022 3 豊富な導入実績による、卓越したノウハウ。 確かな信頼。設計・構築から運用保守まで、 AWSにおけるあらゆるニーズに対応するフルマネージド・サービス。 ● クラウド導入実績 2,500 社以上 ● 年間プロジェクト 4,300 以上 ● AWS プレミアティアサービスパートナーの認定を9年連続で保持

Slide 4

Slide 4 text

今日お話しすること #jawsug #jawsdays #jawsdays2022 ● CloudForation ● Terraform 4 よく使う以下のIaCツールについて、それぞれの素晴らしさとアンチパターン についてお話ししていきたいと思います。

Slide 5

Slide 5 text

#jawsug #jawsdays #jawsdays2022 5 今日お話しないこと https://www.meiji.co.jp/sweets/chocolate/kinotake/

Slide 6

Slide 6 text

#jawsug #jawsdays #jawsdays2022 6 IaC使ってますか!?

Slide 7

Slide 7 text

#jawsug #jawsdays #jawsdays2022 7 IaCを使う理由 ● 1度作ったリソースは作成が簡単になる ● インフラ管理のコスト削減できる ● 書いていて楽しい IaC素晴らしいですよね。

Slide 8

Slide 8 text

#jawsug #jawsdays #jawsdays2022 8 CloudFormationの素晴らしいところ ソフトウェアのインストールが不要で、マネジメントコンソールから デプロイできる。 学習コストが比較的低く、スタートが簡単

Slide 9

Slide 9 text

#jawsug #jawsdays #jawsdays2022 9 CloudFormationの素晴らしいところ 正規表現やプルダウンなどを指定することができるので、作成の際に 迷うことが減る。 パラメーターの制御が柔軟 DBPassword: Default: "dbpassword" NoEcho: true Type: String MinLength: 8 MaxLength: 41 AllowedPattern: "[a-zA-Z0-9]*" MultiAZ: Default: "false" Type: String AllowedValues: ["true", "false"]

Slide 10

Slide 10 text

#jawsug #jawsdays #jawsdays2022 10 Terraformの素晴らしいところ 柔軟なリソース作成制御ができる for_eachなどを用いることにより、同じリソースを複数作成する事が可能 ● 複数リソースの作成 ○ for_each,count,dynamicなど ● リソースの作成可否 ○ count,三項演算子など 個人的にはパラメーターをignoreできるのがイチオシなポイント --targetで分割してデプロイできるのも良い。 resource aws_subnet this { count = local.create_subnet ? 1 : 0 vpc_id = var.vpc_id cidr_block = var.cidr_block availability_zone = var.availability_zone }

Slide 11

Slide 11 text

#jawsug #jawsdays #jawsdays2022 11 Terraformの素晴らしいところ module機能① リソースが定義されたTFファイルを集約し、moduleという単位に分割する。 vpc.tf よくある構成 ec2.tf role.tf subnet.tf policy.tf VPC EC2 IAM SG module sg.tf

Slide 12

Slide 12 text

#jawsug #jawsdays #jawsdays2022 12 Terraformの素晴らしいところ module機能② 分割したmoduleを環境毎のmain.tfなどから呼び出して使用する。 VPC EC2 IAM SG module main.tf 使うmoduleを指定する パラメーターを渡すだけ . ├── env │ ├── dev │ │ └── main.tf │ └── prod │ └── main.tf └── modules ├── ec2 │ └── ec2.tf ├── rds │ └── rds.tf └── vpc └── vpc.tf

Slide 13

Slide 13 text

#jawsug #jawsdays #jawsdays2022 13 IaCは銀の弾丸じゃない ということで、ここからアンチパターンについて紹介していきます。 あくまで今から紹介する内容は一部でしかないと思います。

Slide 14

Slide 14 text

#jawsug #jawsdays #jawsdays2022 14 CloudFormationアンチパターン 手動とCFnの並行管理 CFnで作成したリソースを手動で変更することもできます。 しかし、手動変更部分の管理が発生しコード管理が煩雑になるのでやめよう。 どうしても手動変更したい場合にはCFnを捨てる。 ドリフト発生

Slide 15

Slide 15 text

#jawsug #jawsdays #jawsdays2022 15 CloudFormationアンチパターン OutPut名を適当につける Outputs: WebSubnet: Description: Web Public Subnet Value: !Ref WebSubnet Export: Name: "WebSubnet" PrivateSubnet: Description: Private Subnet Value: !Ref PrivateSubnet Export: Name: "PrivateSubnet" クロススタック参照やネストスタックする時に名前が分からず困ることも。 新たにWebSubnetなどが増えた時に困ることも多い。 ● 連番を付与する ● ${AWS::StackName}をリソース 名のpirefixに付与する

Slide 16

Slide 16 text

#jawsug #jawsdays #jawsdays2022 16 CloudFormationアンチパターン パラメータを入力させ過ぎる 構成としては同じものが出来上がるかもしれないが、入力を増やすことにより 作業者の労力が増えるのでなるべく可能なものは参照する。 VPCやSubnetのIDを入力させる形式などになっていると、 「手で作った方が楽なんじゃ・・・」と思えてくることも。

Slide 17

Slide 17 text

#jawsug #jawsdays #jawsdays2022 17 Terraformアンチパターン countを使用しての複数リソース作成 countを使用することで複数のリソースを作成することができるが、 indexがズレて意図しない動作をすることがあるので、for_eachを使用する。 # サブネットを作成する resource aws_subnet this { count = length(local.subnets_pub) vpc_id = aws_vpc.this.id cidr_block = values(var.subnets)[count.index].cidr_block availability_zone = values(var.subnets)[count.index].availability_zone } locals { subnets_pub = { sntpub1a01 = { name = "sntpub1a01" cidr_block = "192.168.1.0/24" availability_zone = "ap-northeast-1a" } sntpub1c01 = { name = "sntpub1c01" cidr_block = "192.168.2.0/24" availability_zone = "ap-northeast-1c" } sntpub1a01を消した時に配列なのでsntpub1c01が [1]→[0]へ詰められリソースの再作成が発生する。

Slide 18

Slide 18 text

#jawsug #jawsdays #jawsdays2022 18 Terraformアンチパターン 環境毎にリソースのtfファイルを分ける 本番と検証で同じ構成を作りたい場合にはmoduleにして使用するべき。 tfファイルを分けることで、2重管理が必要となり環境毎の差異が発生する。 . └── env ├── dev │ ├── ec2.tf │ ├── rds.tf │ └── vpc.tf └── prod ├── ec2.tf ├── rds.tf └── vpc.tf . ├── env │ ├── dev │ │ └── main.tf │ └── prod │ └── main.tf └── modules ├── ec2 │ └── ec2.tf ├── rds │ └── rds.tf └── vpc └── vpc.tf 変更

Slide 19

Slide 19 text

#jawsug #jawsdays #jawsdays2022 19 まとめ メリット ● 1度作ったリソースは作成が簡単になる ● インフラ管理のコスト削減できる ● 書いていて楽しい デメリット ● 学習コストがある程度必要 ● IaC or 手作業のどちらかに寄せる必要がある

Slide 20

Slide 20 text

#jawsug #jawsdays #jawsdays2022 20 まとめ 今回紹介したアンチパターンはあくまで一部でしか ないと思います。 なので、皆さんの中でより良いIaCを見つけていって ください!

Slide 21

Slide 21 text

#jawsug #jawsdays #jawsdays2022 21 NO IaC, NO LIFE.