Terraformを使ってEC2インスタンスにIAMロールを当ててみる
HashiCorp Advent Calendar 2015の4日目の担当がいらっしゃらないようでしたので、最近試したことでも書いておこうかと思います。検証が不十分な部分があるかと重いますがご容赦下さい(現在12/4 23:25です)
前日はk1LoW - QiitaさんのTerraformで簡単なところからいろいろ試してみた報告(tfファイル付き) - Qiitaという記事でした。Terraformの知見が増えてきて嬉しいですね。
さて、この記事ではタイトル通りTerraformを使ってIAMロールをEC2の付与することをご紹介します。
IAMロールとは
EC2インスタンスからawsのAPIを叩こうと思った時に気になるのが、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についてはこちらを確認するとよさそうです!