Slide 1

Slide 1 text

Terraform on AWS入門ハンズオン 2019-12-05 @paddyOTI

Slide 2

Slide 2 text

自己紹介 ● @paddyOTI ● お仕事 ○ 渋谷のどっかでアドテクエンジニアやってます ○ 基本サーバーサイドの仕事が多かったが、最近は インフラ系の仕事やったり数値分析したりも

Slide 3

Slide 3 text

アジェンダ ● Terraformって何?使うとなんで嬉しいの? ● 今日作るインフラ構成 ● ハンズオン ● Terraformのインストール ○ コードの説明 ○ コマンドの説明 ● 参考資料

Slide 4

Slide 4 text

今日のゴール ● Terraformの基本的な文法を押さえる ● Terraformの基本的なコマンドを押さえる ● 自力でドキュメントを追えるようにする ○ どんなリソースにどんな設定ができるか、全てを覚えるのは現実的でない ○ 必要になった時に調べられるようにする

Slide 5

Slide 5 text

Terraformって何?使うと何が嬉しいの? ● Motivation ○ こんなことありませんか? ■ インフラ構築手順を手動で何度も行うのは時間がかかる ■ (手順書があるとしても)作業中に手順ミスをしてしまって事故ってしまった … ■ 導入後に構成変更があるかもしれない。簡単かつミスが発生しない形で構成や設定を変更し たい ■ ドキュメントがあったが、構築後に構成変更があったのか、変更内容がドキュメントに反映さ れていない

Slide 6

Slide 6 text

Terraformって何?使うと何が嬉しいの? ● Solution ○ インフラ構築内容をコードで記述して管理できるようにする ■ 一度書いてしまえば、あとは実行するだけで書いた通りのインフラ環境が作られる ■ 設定変更したいときは、コードの一部を修正してコードを実行すれば容易に環境変更できる ● Gitなどによる設定のバージョン管理もできるようになる ○ インフラ構築・設定変更を自動化する ■ 手動で行う作業を無くし、本質的な設計などに注力できる ■ 手動で行うことによる設定ミスがなくなる

Slide 7

Slide 7 text

類似ツール(Cloudformation)との違い Terraform Cloudformation 独自のスクリプト言語 (HCL)で記述する JSON, yaml形式で記述する OSSなのでAWS, GCP, Azureなどのインフラ 構築に対応できる AWSサービスの一種のため AWSでしか利用できない AWS公式サポート、最新の変更に追従しや すい

Slide 8

Slide 8 text

今日作るインフラ構成

Slide 9

Slide 9 text

今日のソースコード https://github.com/takayuki-ochiai/supporterz-terraform-tut orial

Slide 10

Slide 10 text

Terraformのインストール ● Mac/Linuxの人はtfenvを使ってTerraformのバージョンを管理できる状態でインス トールすることをオススメします ○ プロジェクトによって微妙にバージョンの異なる Terraformを使うことがよくある ○ 簡単にTerraformのバージョンを切り替えができた方が色々便利 ○ Windowsだとtfenv使えないっぽいので、今回は 0.12.6を公式サイトからダウンロードしてください

Slide 11

Slide 11 text

Terraformのインストール ● Macの場合

Slide 12

Slide 12 text

Terraformのインストール ● Windows10の場合 ○ 下記のURLからTerraformのzipアーカイブをダウンロード ■ 64bitの場合 ● https://releases.hashicorp.com/terraform/0.12.6/terraform_0.12.6_windows_amd64. zip ■ 32bitの場合 ● https://releases.hashicorp.com/terraform/0.12.6/terraform_0.12.6_windows_386.zip ○ C:\hashicorp\terraform\0.12.6 というディレクトリを作っておき zipファイルの中身を C:\hashicorp\terraform\0.12.6 に展開 ■ C:\hashicorp\terraform\0.12.6\terraform.exe ができればOK ○ C:\hashicorp\terraform\0.12.6 にPATHを通す ○ PowerShellなどからterraform -vなどが呼べれば成功!

Slide 13

Slide 13 text

Terraformの書き方 ● Terraformの設定は.tfという拡張子をつけたファイルに書きこみます ● TerraformのコードはHCL(Hashicorp Configration Language) という言語で実装し ていきます ● terraform applyというコマンドを実行すると、カレントディレクトリの全てのtfファイル の設定を読み込んでリソースを作り始めます ○ 同じディレクトリのtfファイルは全て読まれるので、同じ内容であれば tfファイルは1つにまとめても、 複数のtfファイルに分割しても、実行される結果は変わりません。 ○ 全てのリソースを1つのファイルに記述してしまうと見通しが悪くなるので、適宜ファイルは分割した 方がいいです ■ 今回はそんなに量もないので、最低限しか分割してませんが …

Slide 14

Slide 14 text

Terraformの書き方(基本設定) ● terraformブロックを記述 ○ terraform ブロック ■ 使用するTerraformのバージョンやTerraformが管理するリソースの情報をどこで管理するか など、Terraform自体の設定をする ○ 今回はTerraformのバージョン指定と、リソースの状態を管理するファイルの保存先を指定していま す。 ■ 複数人でTerraformを管理する場合は、 tfstateファイルはローカルではなく S3などに保存する ように設定しましょう ■ DynamoDBを使ってStateLockするとより安心

Slide 15

Slide 15 text

Terraformの書き方(基本設定2) ● providerブロックを記述 ○ providerブロック ■ Terraform自体はAWS/GCP/Azureなどに対応しているため、どのプラットフォームを利用する のかを設定する ■ Terraformはコアな処理を担当する Terraform本体と各プラットフォームに依存した処理を担 当 するプロバイダーで実行ファイルが分割されている ■ 今回はAWS providerを利用する。リソースを構築するリージョンを指定

Slide 16

Slide 16 text

Terraformの書き方(VPC作成) ● まずはVPCを作ってみましょう ○ 新しく作成したいリソースは resourceというブロックを使って定義します ○ resouce “aws_vpc” “リソース名” で、”aws_vpc.リソース名” で他のリソースから参照できる VPCを 作ることができます

Slide 17

Slide 17 text

早速実行してみよう ● なにはともあれ terraform init ○ Terraformの実行に必要なプロバイダ用のバイナリをダウンロードしてくれる ● 実行前にterraform planで変更予定内容を表示する ○ 要するにDry run ○ 作成したコードに文法的な誤りがないか、適用した結果どんなリソースが作成される予定か(実行 計画)を表示してくれる ● 実行計画を見て想定通りであれば、 terraform applyで実行! ● うまくいったことが確認できたら terraform fmtでコードをコードのスタイルを揃えて おきましょう

Slide 18

Slide 18 text

サブネット インターネットゲートウェイ ● 同様にresourceブロックを書 いていく ○ 先にresourceブロックで定義し たvpcの中にサブネットを作り たい ○ 18行目、32行目、45行目に注 目 ○ TYPE.NAME.ATTRIBUTEの形 式で書けば他のresourceブ ロックで定義したリソースの情 報にアクセスできる ○ aws_vpc.terraform_example _vpc.id がそれ

Slide 19

Slide 19 text

ルートテーブル ● ルートテーブル本体 (aws_route_table)と、ルート テーブルに登録するルーティ ング情報(aws_route)を定義 する ● どのサブネットにどのルート テーブルを関連づけるか aws_route_table_associati onで設定する

Slide 20

Slide 20 text

セキュリティグループ ● セキュリティグループ本体 (aws_security_group)とセ キュリティグループに設定す るルール (aws_security_group_rule) を定義する

Slide 21

Slide 21 text

EC2インスタンス ● 異なるAZに同じ設定のEC2インスタンスを構築したい ○ あらかじめテンプレートを用意して使いまわせるようにする ○ moduleという形で作成したいリソースのテンプレートを作っておき、 main.tfからは moduleブロックを使って呼び出すようにする ● EC2インスタンスを構築するにはEC2インスタンスの構築に利用する AWS公式のAMIを指定しなければいけない ○ 既にAWS上に存在するリソースを利用するには dataブロックを使う

Slide 22

Slide 22 text

モジュールの呼び出し方 ● モジュールを利用したい場合、 moduleブロックを使って呼び出 すことができる ● default値がない変数は全て記 述しないとエラーになるため注 意する

Slide 23

Slide 23 text

モジュールの作り方① ● modulesディレクトリを作成 ○ モジュール用のコードはこのディレ クトリの下に作成する ● modulesディレクトリの中に http_serverディレクトリを作り ○ Terraformはモジュールをディレク ト リ単位で分割して作成する ○ モジュールの具体的内容を定義す るmain.tfと、moduleで定義した内 容を外部から参照するための変数 名を定義するoutputs.tfを作成

Slide 24

Slide 24 text

モジュールの作り方② ● モジュールが受け取る引数を指 定 ○ moduleでリソースを構築する時に 動的に決定したい内容は引数で受 け取るようにする ○ 引数を宣言したいときは variable属 性を使う ○ 今回はどのサブネットに、どんなセ キュリティグループを付与して、イ ンスタンスタイプをどうするかなど を指定できるようにする ○ デフォルト値を指定したいときは default属性を利用する

Slide 25

Slide 25 text

モジュールの作り方③ ● AWSの公式AMIを指定する ○ Terraformで管理されていない、既 にAWS上に存在するリソースを参 照するには、dataブロックを使用す る ○ 今回はAMIの名前とstateを条件 に、条件に該当する AMIのなかで 最新のものを利用する

Slide 26

Slide 26 text

モジュールの作り方④ ● dataブロックやmoduleの引数と して与えられる変数をもとに、 EC2インスタンスのリソースを作 成する

Slide 27

Slide 27 text

モジュールの作り方⑤ ● moduleで作ったEC2インスタン スのidはあとで利用するため、 moduleの呼び出し元から参照 できるようにしておく ● outputブロックを使わないと、モ ジュール外部からモジュールで 作成したリソースの情報にアク セスできるようにならない!

Slide 28

Slide 28 text

ロードバランサー ● 実装が簡単に済むため、あ えてクラシックロードバラン サーを使用する ● モジュールで構築したEC2イ ンスタンスのIDは module.NAME.ATTRIBUTE で参 照する

Slide 29

Slide 29 text

もう一度実行してみよう ● もう一度 terraform init ○ moduleを新しく追加・更新したときは terraform initでmoduleを読み込む必要があ る ● 実行計画を見て想定通りであれば、 terraform applyで実行! ● aws elb describe-load-balancersコマン ドなどでDNS名を把握してアクセスして みて、apacheのテストページが表示され ていれば成功! $ aws elb describe-load-balancers { "LoadBalancerDescriptions": [ { "LoadBalancerName": "terraform-example-elb", "DNSName": "terraform-example-elb-935365947.ap-northeast-1.elb.amazonaws.com", "CanonicalHostedZoneName": "terraform-example-elb-935365947.ap-northeast-1.elb.amazonaws.com", "CanonicalHostedZoneNameID": "Z14GRHDCWA56QT", "ListenerDescriptions": [ { "Listener": { "Protocol": "HTTP", "LoadBalancerPort": 80, "InstanceProtocol": "HTTP", "InstancePort": 80 }, "PolicyNames": [] } ],

Slide 30

Slide 30 text

リソースを削除する ● このまま放置しているとずっと課金されてしまうので、リソースを削除する ○ terraformで作成したリソースを削除したいときは、 terraform destroyコマンドを実行する

Slide 31

Slide 31 text

押さえておくべきドキュメント・書籍 ● 公式のAWS Providerドキュメント (英語) ○ https://www.terraform.io/docs/providers/aws/ ○ AWSの各種resourceブロックやdataブ ロックで指定できるオプション、使用例 が細かく載っている ○ 画面左上の検索窓から検索もできるの で使いやすい ○ 使ったことがないリソースを作るときは 一度は確認した方がいい

Slide 32

Slide 32 text

押さえておくべきドキュメント・書籍 ● 実践Terraform ○ もともと同人誌として売り出されていた Pragmatic Terraform on AWSという本 をもとに、大幅に加筆されて商業誌化さ れた ○ 同人誌版のクォリティが非常に高く、期 待できる ○ Terraform をAWSで使うときのリファレ ン ス、あるいはTerraformの設計に迷った 時の指針として利用できる

Slide 33

Slide 33 text

押さえておくべきドキュメント・書籍 ● Terraform職人入門: 日々の運用で 学んだ知見を淡々とまとめる ○ 実際にTerraformを運用する視点から、 実践的なTIPsが詰まった良記事

Slide 34

Slide 34 text

ご清聴ありがとうございました!