こんにちは。よっしーです(^^)
今日は、先日作成したTerraformの実行用IAMユーザーへのポリシーの作成についてご紹介します。
背景
Terraformを使用してAWSリソースを作成、変更、削除する場合、TerraformはAWS APIを呼び出して、必要なリソースを作成または変更します。このため、Terraformを実行するIAMユーザーには、必要なリソースを作成、変更、削除するための十分な権限が必要です。
ポリシーは、IAMユーザーが必要なリソースにアクセスできるようにするために使用されます。IAMユーザーに対して適切なポリシーが割り当てられていない場合、TerraformはAWS APIに対して十分な権限を持っていないため、必要なリソースを作成、変更、削除することができません。
そのため、Terraformを実行するIAMユーザーには、Terraformが必要とするすべてのリソースに対して必要なアクセス権を持つポリシーを割り当てることが重要です。ただし、必要な最小限の権限のみを付与するようにポリシーを作成し、IAMユーザーにはそれ以上の権限を与えないことが推奨されます。
上記の理由から、Pikeというオープンソースを使用して、最小限のポリシーを付与します。
Pikeのインストール
Pikeの公式サイトは下記になります。
このサイトのインストール手順に従い、下記の手順でインストールしました。
% brew tap jameswoolfenden/homebrew-tap
% brew install jameswoolfenden/tap/pike
% Pike --version
pike version v0.2.74
main.tfの用意
下記のmain.tfファイルを用意します。
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.16"
}
}
required_version = ">= 1.2.0"
}
provider "aws" {
region = "ap-northeast-1"
}
resource "aws_instance" "app_server" {
ami = "ami-04310c38b29b29953"
instance_type = "t2.micro"
tags = {
Name = "ExampleAppServerInstance"
}
}
ポリシーの抽出
main.tfファイルがあるディレクトリで下記のコマンドを実行します。
pike scan .
上記のコマンド実行の結果として、下記の結果が得られます。
resource "aws_iam_policy" "terraform_pike" {
name_prefix = "terraform_pike"
path = "/"
description = "Pike Autogenerated policy from IAC"
policy = jsonencode({
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"ec2:CreateTags",
"ec2:DeleteTags",
"ec2:DescribeInstanceAttribute",
"ec2:DescribeInstanceCreditSpecifications",
"ec2:DescribeInstanceTypes",
"ec2:DescribeInstances",
"ec2:DescribeTags",
"ec2:DescribeVolumes",
"ec2:ModifyInstanceAttribute",
"ec2:RunInstances",
"ec2:StartInstances",
"ec2:StopInstances",
"ec2:TerminateInstances"
],
"Resource": [
"*"
]
}
]
})
}
ポリシーの適用
下記のコマンドでポリシーの作成ができる想定でしたが、エラーで作成できませんでした。
pike make .
なので、上記のポリシーをAWSコンソールマネジメントから適用すると最低限のポリシー適用ができると思います。
なお、エラー内容は下記になります。もし、わかる方がいれば教えて下さい。
% pike make .
11:59PM DBG terraform init at /Users/xxx/github/Musica/02_learn-terraform-docker-container
11:59PM DBG modules not found at .
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x2 addr=0x0 pc=0x104a379d4]
goroutine 1 [running]:
main.main.func1(0x104da73c0)
/home/runner/work/pike/pike/main.go:51 +0x34
github.com/urfave/cli/v2.(*Command).Run(0x140001726e0, 0x140003ea980, {0x140003ea9c0, 0x4, 0x4})
/home/runner/go/pkg/mod/github.com/urfave/cli/v2@v2.25.1/command.go:274 +0x78c
github.com/urfave/cli/v2.(*Command).Run(0x140001734a0, 0x140003ea800, {0x14000114050, 0x5, 0x5})
/home/runner/go/pkg/mod/github.com/urfave/cli/v2@v2.25.1/command.go:267 +0x9ac
github.com/urfave/cli/v2.(*App).RunContext(0x1400045a000, {0x104e97e30?, 0x1400012e008}, {0x14000114050, 0x5, 0x5})
/home/runner/go/pkg/mod/github.com/urfave/cli/v2@v2.25.1/app.go:332 +0x604
github.com/urfave/cli/v2.(*App).Run(...)
/home/runner/go/pkg/mod/github.com/urfave/cli/v2@v2.25.1/app.go:309
main.main()
/home/runner/work/pike/pike/main.go:302 +0x2f60
と書いていて、気付きましたが、下記のコマンドを実施して、AWSのプロファイル設定をすれば、実行できました。
export AWS_PROFILE=terraform
% pike make .
12:21AM DBG terraform init at /Users/xxx/github/Musica/02_learn-terraform-docker-container
12:21AM DBG modules not found at .
12:21AM DBG aws role create/updated arn:aws:iam::xxx:role/terraform_pike_20230509151755154200000002
12:21AM DBG arn:aws:iam::xxx:role/terraform_pike_20230509151755154200000002
作成したterraform_pike_20230509151755154200000002ポリシーをTerraformの実行用IAMユーザーに適用すれば、最小限のポリシー設定の完成です。
未確認ですが、ポリシー作成にterraformのIAMユーザーを使用しているので、ポリシー作成の際にポリシー作成の権限が必要かもしれません。このときは、AdministratorAccessをつけていました。
おわりに
今日は、Terraformの実行用IAMユーザーのポリシー作成についてご紹介しました。次回は、Terraformを使用してAWSリソースの作成をしたいと思います。
何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント