Upgrade to Pro — share decks privately, control downloads, hide ads and more …

IaC運用してみて感じた 素晴らしさとアンチパターン

Yuki_Kurono
September 25, 2022

IaC運用してみて感じた 素晴らしさとアンチパターン

Yuki_Kurono

September 25, 2022
Tweet

More Decks by Yuki_Kurono

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  9. #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"]

    View Slide

  10. #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
    }

    View Slide

  11. #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

    View Slide

  12. #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

    View Slide

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

    View Slide

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

    View Slide

  15. #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に付与する

    View Slide

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

    View Slide

  17. #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]へ詰められリソースの再作成が発生する。

    View Slide

  18. #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
    変更

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide