読者です 読者をやめる 読者になる 読者になる

tjinjin's blog

いつかすごいエンジニアになることを目指して、日々学んだことを書いていきます。

Terraformを使ってEC2インスタンスにIAMロールを当ててみる

HashiCorp Advent Calendar 2015の4日目の担当がいらっしゃらないようでしたので、最近試したことでも書いておこうかと思います。検証が不十分な部分があるかと重いますがご容赦下さい(現在12/4 23:25です)

前日はk1LoW - QiitaさんのTerraformで簡単なところからいろいろ試してみた報告(tfファイル付き) - Qiitaという記事でした。Terraformの知見が増えてきて嬉しいですね。

さて、この記事ではタイトル通りTerraformを使ってIAMロールをEC2の付与することをご紹介します。

IAMロールとは

EC2インスタンスからawsAPIを叩こうと思った時に気になるのが、credentialの扱いかと思います。AWSにはIAMロールという機能があり、その機能をEC2インスタンスに付与することでcredentialファイルを自分で用意しなくても、そのEC2インスタンスにはcredentialがあるとみなされAPIを叩くことができる機能です。インスタンス作成時?にしか付与することができないので、とりあえず付けようとされる方が多いのではないでしょうか。

terraformで環境構築することが増えてきましたので、IAMロールも合わせて作ってみようと思います。

tfファイル

下記のような形でIAMロールを作成し、インスタンスに設定してあげるとロールが付与できます。

##### IAM role
resource "aws_iam_instance_profile" "instance_role" {
    name = "instance_role"
    roles = ["${aws_iam_role.instance_role.name}"]
}

resource "aws_iam_role" "instance_role" {
    name = "instance_role"
    assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF
}

resource "aws_iam_role_policy" "instance_role_policy" {
    name = "instance_role_policy"
    role = "${aws_iam_role.instance_role.id}"
    policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "*",
      "Resource": "*"
    }
  ]
}
EOF
}


##### Instances

resource "aws_instance" "test" {
    ami = "${var.test_ami}"
    instance_type = "${var.test_instance_type}"
    key_name = "${var.key_name}"
    security_groups = ["${aws_security_group.test.id}"]
    subnet_id = "${aws_subnet.1a-public.id}"
    iam_instance_profile = "instance_role"
    count = 1
    root_block_device {
        delete_on_termination = "true"
    }
}

解説

aws_iam_instance_profile のリソースはインスタンスのところで指定するiam_instance_profileに対応しています。インスタンスに付与したいinstance_profileを指定しましょう。

IAMには2つの考え方があり、どのサービス・人についての権限を持っているか、そのサービスについて何を許可・拒否するかをそれぞれ指定します。前者がaws_iam_roleで後者がaws_iam_role_policyにあたります。(若干間違っているかもしれません)コンソールからIAMロールをいじるとあまり意識しないのですが、これら3つのリソースを指定する必要がありますので注意しましょう。Terraformのドキュメントを見るだけだと勘違いすることもあるかもしれません。

今回のポリシーは検証用で甘めに作っていますので、適切な権限設定をされるとよいかと思います。

参考

IAMについてはこちらを確認するとよさそうです!