今回はAWSのEC2,AMIを管理できるTerraformのコードをまとめてみました!
Terraform Registoryがめちゃくちゃ優秀なので、英語がわからなくても翻訳使えばある程度はできるかなと思います。
が、私自身わからなくなった時に検索しても英語の記事が多くて困った経験があるので、ここにはAWS公式のリンクも所々に貼っています。
この記事が皆さんの参考になればと思います。
- EC2インスタンスを作成するコードの例
- ami(必須)
- availability_zone(オプション)
- placement_group(オプション)
- tenancy(オプション)
- host_id(オプション)
- cpu_core_count(オプション)
- cpu_threads_per_core(オプション)
- ebs_optimized(オプション)
- disable_api_termination(オプション)
- instance_initiated_shutdown_behavior(オプション)
- instance_type(必須)
- key_name(オプション)
- get_password_data(オプション)
- monitoring(オプション)
- security_groups(オプション,EC2-ClassicおよびデフォルトのVPCのみ)
- vpc_security_group_ids(オプション)
- subnet_id(オプション)
- associate_public_ip_address(オプション)
- private_ip(オプション)
- secondary_private_ips(オプション)
- source_dest_check(オプション)
- user_data(オプション)
- user_data_base64(オプション)
- iam_instance_profile(オプション)
- ipv6_address_count(オプション)
- ipv6_addresses(オプション)
- tags(オプション)
- volume_tags(オプション)
- hibernation(オプション)
- root_block_device(オプション)
- ephemeral_block_device(オプション)
- network_interface(オプション)
- credit_supecification(オプション)
AMI
Amazon Machine Imageの略。
Amazon EC2インスタンスのテンプレート、元となるものです。
AMIにはインスタンス起動に必要な情報がはいっているので、EC2インスタンスを作成する際に必要不可欠なものです。
以下にAMIの作成方法と、既製のAMIのIDを取得するコードをまとめていきます。
EC2インスタンス作成に必要なAMIをカスタム作成するコードの例
resource "aws_ami" "test" { name = "test" virtualization_type = "hvm" root_device_name = "/dev/xvda" ebs_block_device { device_name = "/dev/xvda" snapshot_id = "snap-xxxxxxxx" volume_size = 8 } }
引数一覧
name(必須)
amiにつける名前の指定
virtualization_type(必須)
インスタンスで使用する仮想化タイプを選択するキーワード。 「paravirtual」(デフォルト)または「hvm」のいずれか。
【paravitualとhvmの違い】
PV AMI と HVM AMI の主な違いは、起動の方法と、パフォーマンス向上のための特別なハードウェア拡張機能 (CPU、ネットワーク、ストレージ) を利用できるかどうかという点です。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/creating-an-ami-instance-store.html
・virtualization_typeでparavitualを指定すると下記の引数が必要になります。
– image_location(必須) = イメージマニフェストを含むS3オブジェクトへのパス。例えばEC2コマンドラインツールのec2-upload-bundleコマンドによって作成される。
– kernel_id(必須) = 作成されたインスタンスで準仮想カーネルとして使用されるカーネルイメージ(AKI)のID
– ramdisk_id(オプション) = 作成されたインスタンスの起動時に使用される initrd イメージ(ARI)の ID
・hvmを指定すると下記の引数が使えます。
– sriov_net_support(オプション) = 「simple」(デフォルト)に設定すると、作成されたインスタンスのネットワーク機能が強化される。 現時点では他の値はサポートされていない。
root_device_name(オプション)
ルートデバイスの名前
【使用可能なデバイス名】
description(オプション)
AMIについての説明
ena_support(オプション)
Elastic Network Adapter(ENA)を使用した拡張ネットワーキングを有効にするかどうかを指定する。
デフォルトは false 。
【ENAとは】
architecture(オプション)
作成されたインスタンスのマシンアーキテクチャ。
デフォルトは「x86_64」。
tags(オプション)
タグ。(そのまんま)
ebs_block_device(オプション)
Amazon Elastic Block Store(EBS)ブロックデバイスについての設定
– ebs_block_device 構築内容 –
・device_name(必須) = デバイスの名前
・device_on_termination(オプション) = インスタンスが終了するとEBSボリュームを削除するかの設定。(bool値)
・snapshot_id(オプション) = EBSスナップショットのID。
これを設定した場合、volume_sizeはスナップショットと同じか、それ以上のサイズであること。
encryptedと一緒に使用することができない。
・encrypted(オプション) = EBSボリュームを暗号化するかどうかの設定。(bool値)
snapshot_idと一緒に使用することができない。
・volume_size(snapshot_id が設定されていない場合は必須) = ボリュームのサイズ(GiB単位)。
指定しない場合はスナップショットと同じサイズになる。
・volume_type(オプション) = 作成するEBSボリュームのタイプ。
「standard」(デフォルト)、「gb2」「io1」「sc1」のいずれか。
【ボリュームの種類】
・iops(volume_type が “io1” の場合のみ必須) = 作成されたボリュームがサポートする毎秒のI/O オペレーションの数
・kms_key_id(オプション) = コピー操作中にイメージのスナップショットを暗号化するときに使用する AWS Key Management Service(AWS KMS)CMKのARN。
デフォルト以外の CMK を使用する場合にだけ必要。
指定しない場合、EBS のデフォルトの CMK が使用される。
ephemeral_block_device(オプション)
エフェメラルブロックデバイスについての設定
– ephemeral_block_device 構築内容 –
・device_name(必須) = デバイスの名前
・virtual_name(必須) = エフェメラル デバイスの名前。「ephemeralN」の形式で、N はゼロから始まるボリューム番号。
【インスタンスストアについて】
Terraform Registryを元に書きました。
EC2インスタンス作成に必要な既成のAMI IDを取得するコードの例
data "aws_ami" "test" { executable_users = ["self"] most_recent = true name_regex = "^myami-\\d{3}" owners = ["self"] filter { name = "name" values = ["myami-*"] } filter { name = "root-device-type" values = ["ebs"] } filter { name = "virtualization-type" values = ["hvm"] } }
引数一覧
owners(必須)
AMIの所有者情報に基づき検索条件を絞る。
少なくとも1つ指定する必要がある。
有効な値:AWSアカウントID、「self」(現在のアカウント)、またはAWSオーナーエイリアス(amazon、aws-marketplace、microsoftなど)。
most_recent(オプション)
AMIが複数見つかった場合に最新のAMIを使用するか。(bool値)
executable_users(オプション)
明示的な起動権限を持つユーザによってイメージのフィルターを設定する。
有効な項目は、AWSアカウント ID またはself。
name_regex(オプション)
AWS が返すAMIリストに適用する 名前の正規表現。
より高度なフィルタリングが可能。
filter(オプション)
AMIの検索条件
【AWS CLIでAMIの検索】
– filterで使える値 –
・arn = AMIのARN
・architecture = AMIのアーキテクチャ
・block_device_mappings = AMIのブロックデバイスマッピング
– block_device_mappings.#.device_name = デバイスの名前
– block_device_mappings.#.ebs.delete_on_termination = 終了時にEBS ボリュームが削除される場合はtrue。
– block_device_mappings.#.ebs.encrypted = ボリュームが暗号化されている場合はtrue。
– block_device_mappings.#.ebs.iops = EBSボリュームがプロビジョニングされたIOPSイメージがない場合は0。
プロビジョニングされていない場合は、サポートされているIOPSの数を指定。
– block_device_mappings.#.snapshot_id = スナップショットのID
– block_device_mappings.#.ebs.volume_size = ボリュームのサイズ(GiB単位)
– block_device_mappings.#.ebs.volume_type = ボリュームタイプ
– block_device_mappings.#.no_device = AMIのブロックデバイスマッピングに含まれている指定されたデバイスのフィルター
– block_device_mappings.#.virtual_name = 仮想デバイス名
・creation_date = イメージが作成された日付,時刻
・description = AMIの説明
・hypervisor = イメージのhypervisorタイプ
・image_id = AMIのID(リソースID)
・image_location = AMIの場所(S3ベースのAMIであればS3内の場所、EBSイメージの場合所有者とイメージ名の連結されたもの等 イメージによって意味が異なるそうです)
・image_owner_alias = AWSアカウントエイリアス(amazon,self など)またはAMI所有者のAWSアカウントID
・image_type = イメージのタイプ
・kernel_id = イメージに関連付けられているカーネルID
・name = AMIの名前
・owner_id = イメージ所有者のAWS アカウントID
・platform = この値はWindows for Windows AMI。それ以外の場合は空白。
・product_codes = AMIに関連付けられている製品コード。(製品コードは製品 ID ではない)
– product_codes.#.product_code_id = 製品コード
– product_codes.#.product_code_type =製品コードのタイプ(marketplace など)
・public = public AMIの場合はtrue。
・ramdisk_id = イメージに関連付けられているRAMディスクのID
・root_device_name = ルートデバイスのデバイス名
・root_device_type = ルートデバイスのタイプ(ebsまたはインスタンスストア)
・root_snapshot_id = ルートデバイスに関連付けられているスナップショットID(ebsルートデバイスにのみ適用)
・sriov_net_support = 拡張ネットワーキングを有効にするかどうかを指定。
・state = AMIの現在の状態。状態が「available」の場合イメージは正常に登録されており、インスタンスの起動に使用できる。
・state_reason = AMIの状態変化。「available」でない場合はUNSET。
– state_reason.code = 状態変更の理由コード
– state_reason.message = 状態変更のメッセージ
・tags = イメージについているタグの指定
– tags.#.key = タグのキー名
– tags.#.value = タグの値
・virtualization_type = AMIの仮想化タイプの指定(hvmかparavirtual)
Terraform Registryを元に書きました。
EC2
Amazonの仮想サーバー構築サービス。
スペックによってお金がかかるので注意。
Amazon Elastic Compute Cloud (Amazon EC2) は、アマゾン ウェブ サービス (AWS) クラウドでサイズが変更できるコンピューティングキャパシティーを提供します。Amazon EC2 の使用により、ハードウェアに事前投資する必要がなくなり、アプリケーションをより速く開発およびデプロイできます。Amazon EC2 を使用して必要な数 (またはそれ以下) の仮想サーバーを起動して、セキュリティおよびネットワーキングの設定と、ストレージの管理を行います。Amazon EC2 では、要件変更や需要増に対応して迅速に拡張または縮小できるため、サーバートラフィック予測が不要になります。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/concepts.html
EC2インスタンスを作成するコードの例
resource "aws_instance" "web" { ami = data.aws_ami.test.id instance_type = "t3.micro" tags = { Name = "HelloWorld" } }
引数一覧
ami(必須)
インスタンスに使用するAMIのID
availability_zone(オプション)
インスタンスのアベイラビリティーゾーン
placement_group(オプション)
インスタンスのプレイスメントグループ
【プレイスメントグループ】
tenancy(オプション)
インスタンスのテナンシー
default : 共有ハードウェアインスタンスの実行
dedicated : 専用ハードウェアインスタンスの実行
host : 専用ホスト上で起動(ユーザーが設定を制御できる隔離サーバー)
【EC2インスタンスのテナント属性】
host_id(オプション)
インスタンスが割り当てられる専用ホストのID。
インスタンスを特定の専用ホスト上で起動する場合に使用。
(tenancyでhostを選択した場合)
cpu_core_count(オプション)
インスタンスのCPUコアの数の設定。
(CPUオプションをサポートするインスタンスタイプでのみ使用可能)
【インスタンスタイプ別のCPU コアごとの CPU コア数とスレッド数】
cpu_threads_per_core(オプション)
デフォルトは2。1に設定した場合、起動されたインスタンスでハイパースレッディングが無効になる。
(cpu_core_countが設定されていない場合は無効)
cpu_core_countやcpu_threads_per_coreを変更するとリソースが破棄され、再作成されます。
ebs_optimized(オプション)
起動されたEC2インスタンスをEBS最適化するにはtrue。
インスタンスタイプがデフォルトで最適化されている場合は設定する必要がなく、逆に無効にしても効果はない。
【EBS最適化インスタンス】
disable_api_termination(オプション)
trueの場合、EC2インスタンス終了保護を有効にする。
instance_initiated_shutdown_behavior(オプション)
インスタンスのシャットダウン動作の設定。
デフォルトでEBS-backedインスタンスの場合は「stop」、インスタンスストアインスタンスの場合は「terminate」が設定されている。
(この引数はインスタンスストアインスタンスには設定できない)
【インスタンスによって起動されたシャットダウン動作の変更】
instance_type(必須)
開始するインスタンスのタイプ。
【利用可能なインスタンスタイプ】
key_name(オプション)
インスタンスに使用するキーペアのキー名。
aws_key_pairリソースで管理できる。
get_password_data(オプション)
trueの場合、パスワードデータが利用可能になるのを待って取得(インスタンス起動後パスワードの生成と暗号化に数分かかる場合がある) 。
Windowsインスタンスの管理者パスワードを取得するのに役立つ。
パスワードデータはpassword_dataアトリビュートにエクスポートされる。
【Windowsインスタンスのパスワード設定】
monitoring(オプション)
trueの場合、起動されたEC2インスタンスで詳細監視が有効になる。
(v0.6.0以降で利用可能)
security_groups(オプション,EC2-ClassicおよびデフォルトのVPCのみ)
関連付けるセキュリティグループ名(EC2-Classic)またはID(デフォルトVPC)のリスト。
(こんな感じ→ security_groups = [aws_security_group.test.name])
VPCでインスタンスを作成する場合は、代わりに下のvpc_security_group_idsを使用してください。
vpc_security_group_ids(オプション)
関連付けるセキュリティグループIDのリスト。
(こんな感じ→ vpc_security_group_ids = [aws_security_group.test.id])
subnet_id(オプション)
使用するサブネットID
associate_public_ip_address(オプション)
パブリックIPアドレスをインスタンスに関連付ける。(bool値)
private_ip(オプション)
インスタンスに関連付けるプライベートIPアドレス
secondary_private_ips(オプション)
VPC内のインスタンスのプライマリネットワークインターフェース(eth0)に割り当てるセカンダリプライベートIPv4アドレスのリスト。
インスタンスの作成時に接続されたプライマリネットワークインターフェース(eth0)にのみ割り当てることができる。
既存のネットワークインターフェースには割り当てることができない。
【 プライベートIP アドレスの最大数】
source_dest_check(オプション)
宛先アドレスがインスタンスと一致しない場合に、トラフィックがインスタンスにルーティングされるかどうかの設定(NATまたはVPNに使用)。
デフォルトはtrue。
user_data(オプション)
インスタンスの起動時に提供するユーザーデータ。
この引数を介してgzip圧縮されたデータを渡さないこと。(代わりに下のuser_data_base64を参照してください)
user_data_base64(オプション)
user_dataの代わりに使用して、base64でエンコードされたバイナリデータを直接渡すことができる。
値が有効なUTF-8文字列でない場合は、user_dataの代わりにこの引数を使用してください。
iam_instance_profile(オプション)
インスタンスを起動するIAMインスタンスプロファイル。
インスタンスプロファイルの名前として指定。
EC2のドキュメント(特にiam:PassRole)に従って、認証情報にインスタンスプロファイルを割り当てるための適切な権限があることを確認してください。
【IAMインスタンスプロファイル】
【iam:PassRole】
ipv6_address_count(オプション)
プライマリネットワークインターフェースに関連付けるIPv6アドレスの数。
EC2はサブネットの範囲からIPv6アドレスを選択する。
ipv6_addresses(オプション)
プライマリネットワークインターフェイスに関連付けるサブネットの範囲から1つ以上のIPv6アドレスを指定する。
tags(オプション)
タグ(そのまんま)
volume_tags(オプション)
起動時にインスタンスによって作成されたデバイスに割り当てるタグ
hibernation(オプション)
trueの場合、EC2インスタンスはシャットダウンする前にメインメモリの内容をハードディスク等に退避し、次回起動時に再びメインメモリに読み込んでシャットダウンする前と同じ状態で起動する。
【ハイバネーション】
root_block_device(オプション)
インスタンスのルートブロックデバイスに関する詳細のカスタマイズ
ephemeral_block_device(オプション)
インスタンスのエフェメラル(インスタンスストア)ボリュームのカスタマイズ
– root_device_block_device & ephemeral_block_device 構築内容 –
・volume_type(オプション) = ボリュームのタイプ。 「standard」,「gp2」,「io1」,「sc1」,「st1」を指定できる。 (デフォルトは「standard」)。
・volume_size(オプション) = ボリュームのサイズ(GiB単位)
・iops(volume_type が “io1” の場合のみ必須) = プロビジョニングされたIOPSの量。
・delete_on_termination(オプション) = インスタンスの終了時にボリュームを破棄するかどうか。デフォルトはtrue。
・encrypted(オプション) = ボリュームでEBS暗号化を有効にする。デフォルトはfalse。 snapshot_idと一緒に使用することができない。ドリフト検出を実行するように構成する必要がある。
・kms_key_id(オプション) = ボリュームを暗号化するときに使用するKMSキーのARN。ドリフト検出を実行するように構成する必要がある。
network_interface(オプション)
インスタンスの起動時に接続するネットワークインターフェースのカスタマイズ
– network_interface 構築内容 –
ネットワークインターフェイスを交換/変更すると、EC2インスタンスの再作成がトリガーされます。
ネットワークインターフェイスをインスタンスにデタッチ/変更/再アタッチする必要がある場合は、代わりにaws_network_interfaceまたはaws_network_interface_attachmentリソースを使用してください。
ただし、「network_interface」では、eth0に接続されているEC2インスタンスのデフォルトネットワークインターフェースとして使用される独自のネットワークインターフェースを提供することができます。
・device_index(必須) = ネットワークインターフェイスアタッチメントの整数のインデックス。
インスタンスタイプによって制限される。
・network_interface_id(必須) = 接続するネットワークインターフェイスのID
・delete_on_termination(オプション) = インスタンス終了時にネットワークインターフェイスを削除するかどうか。
デフォルトはfalse。
インスタンスの起動時に新しいネットワークインターフェースを作成するときにのみサポートされるため、現在有効な値はfalseのみ。
credit_supecification(オプション)
インスタンスのクレジットをカスタマイズ
– credit_supecification 構築内容 –
・cpu_credits(オプション) = CPU使用率のクレジットオプション。
「standard」または「unlimited」にすることができる。
T3インスタンスはデフォルトで無制限(unlimited)として起動。
T2インスタンスはデフォルトで標準(standard)として起動。
まとめ
何か間違っている情報などありましたら しらたきのTwitter までお願いいたします!
次回はVPC関連のチートシートを作成しようと思っています。
気長に待っていただけたら嬉しいです!