0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

TerraformでAWSのEC2まわり(SG、IAM、KMS)をデプロイする

Last updated at Posted at 2023-01-29

Terraformシリーズ第5弾はEC2です。EC2を中心にKMSSecurityGroup(以下SG) をかいていきます:bulb:

※過去のTerraform記事はこちら
第一弾:TerraformでAWSリソースをデプロイしてみる
第二弾:TerraformでAWS環境をデプロイする前に認識しておくべきこと
第三弾:TerraformでAWSのIAMまわりをデプロイする
第四弾:TerraformでAWSのネットワークまわりをデプロイする

※以下実際にコードを記述していきますが、"${local.XXX}" と記述されているものは個人的に外出しした箇所なので、より参考になるかと思いそのまま残しておきました。

SecurityGroup

#セキュリティグループの作成
resource "aws_security_group" "SG名" {
  name        = "SG名"
  description = "SG名"
  vpc_id      = aws_vpc.vpc01.id #紐づけるVPC
  tags = {
    Name = "SG名"
  }
}

#インバウンドルール
resource "aws_security_group_rule" "SG名-in01" {
  type              = "ingress"
  description       = "インバウンド元のSG名"
  from_port         = 0 #ポート範囲
  to_port           = 0 #ポート範囲
  protocol          = "-1" #プロトコル(-1はall)
  source_security_group_id = aws_security_group.example_in.id #インバンド元のSG
  security_group_id = aws_security_group.example.id
}

#アウトバウンドルール 
resource "aws_security_group_rule" "SG名-out01" {
  type              = "egress"
  description       = "アウトバウンド先のSG名"
  from_port         = 0 #ポート範囲
  to_port           = 0 #ポート範囲
  protocol          = "-1" #プロトコル(-1はall)
  prefix_list_ids = ["pl-XXXXXXXX"] #基本は不要 VPCエンドポイントへのアクセスがある場合に記載
  source_security_group_id = aws_security_group.example_out.id #アウトバウンド先のSG
  security_group_id = aws_security_group.example.id

上記が基本の記述になります。インアウトのルールが増える場合は01の数字をふやして追記すればOKです。

IAMロール

インスタンスに紐づけるIAMロール(インスタンスプロファイル)を事前に作成しておく必要があります。

#信頼ポリシーの作成
data "aws_iam_policy_document" "assume_role" {
  statement {
    actions = ["sts:AssumeRole"]

    principals {
      type        = "Service"
      identifiers = ["ec2.amazonaws.com"]
    }
  }
}

#IAMロール作成
resource "aws_iam_role" "ロール名" {
  name = "ロール名"
  assume_role_policy = data.aws_iam_policy_document.assume_role.json #紐づける信頼ポリシー
}

#事前に作成したポリシーのアタッチ(複数の前提)
resource "aws_iam_role_policy_attachment" "ロール名" {
  count = "${length(local.example_policylist)}"
  role = aws_iam_role.example_role.name
  policy_arn = "${element(local.example_policylist, count.index)}"
}

#インラインポリシーのアタッチ(もしあれば)
resource "aws_iam_role_policy" "ロール名-in01" {
  name = "ポリシー名"
  role = aws_iam_role.example.name
  policy = file("ディレクトリ/ファイル名.json")
}

#インスタンスプロファイルの作成
resource "aws_iam_instance_profile" "インスタンスプロファイル名" {
  name = "インスタンスプロファイル名"
  role = aws_iam_role.example.name
}

KMS(EC2で利用する場合)

#KMS作成
resource "aws_kms_key" "KMS名" {
  policy = templatefile("ディレクトリ/ファイル名.json") #ポリシーはjsonから取得を前提
  enable_key_rotation = true #キーローデーション(必要なら)
}

#エイリアス作成
resource "aws_kms_alias" "KMS名" {
  name          = "alias/KMS名"
  target_key_id = aws_kms_key.example.key_id
}

EC2

resource "aws_instance" "インスタンス名" {
    ami = "ami-XXXXX" #AMIのID
    instance_type = "t3.medium" #インスタンスタイプ
    disable_api_termination = true #終了保護(ここでは有効)
    monitoring = "false" #詳細モニタリング(ここでは無効)
    key_name = "キーペア名" #キーペア名
    vpc_security_group_ids = aws_security_group.example.id #紐付けるセキュリティグループ
    iam_instance_profile = aws_iam_instance_profile.example.name #紐づけるIAMロール
    subnet_id = aws_subnet.private-1a.id #デプロイ先サブネットID
    private_ip = "XXX.XXXX.XXX.XXX" #プライベートIP(指定がなければ不要)

    #cpu_credits
    credit_specification {
      cpu_credits = "standard" #CPUクレジット 不要ならスタンダード
    }
    
    #rootデバイス
    root_block_device {
      volume_type = "gp3"
      volume_size = 10
      delete_on_termination = "true" #終了のEBS削除(ここでは有効)
      encrypted = "true" #暗号化
      kms_key_id  = aws_kms_key.example.arn #必要なら先に作成したKMSを指定する
    }

    #追加ディスク(必要なら)
    ebs_block_device {
      volume_type = "gp3"
      volume_size = 10
      device_name = "/dev/xvdb" #マウントポイント
      delete_on_termination = "true"
      encrypted = "true"
      kms_key_id  = aws_kms_key.example.arn
    }
    tags = {
      Name = "インスタンス名"
    }
}

t3など一部インスタンスタイプではCPUクレジットが有効化されてしまうようなので、明示的に不要にしてあげる必要があります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?