Terraform moduleを使いながら、IAMロール認証をしようと思ったら変なところで悩んだ
こちら方の記事が大変わかりやすかったので、参考にさせていただきました。
我流でmoduleに分けてIAMロール認証しようとしたら、変なところで悩んだのでそのことを書きたいと思います。
outputの使い方
作成したIAM Role ARNは、Terraform Cloudにセットする必要があるためOutputsとして出力します。
modules/trust/outputs.tf
output "role_arn" {
description = "ARN for trust relationship role"
value = aws_iam_role.tfc_role.arn
}
これをmodule分割したフォルダに配置しても、Changes to Outputsは表示されません。
公式のドキュメントを確認してみると、outputsには3つの用途があるようです。
- 子モジュールから親モジュールに値を渡す
- ルートモジュールからのoutputをCLI出力する
- 他のプロジェクトをoutputした値を別のプロジェクトで参照する
今回は2の用途で使用したいので、実行対象のmain.tfと同じ階層にoutputs.tfを配置し、
子モジュールでoutputした値を出力する必要がありました。
IAMロール作成と実際のリソース作成のプロジェクトは一緒にしたらいかん
参考にした記事や本家のチュートリアルを全く気にせず知ったかぶりで作業をしていたので、IAMロールを作成するプロジェクトと実際のリソースを作成するプロジェクトを一緒にしていました。
IAMロールをTerraform経由で作成できたので、環境変数からアクセスキーを削除し、追加のリソースを作成しようとしました。
policy allows the iam:GetRole action status code: 403
その結果、上記のエラーが出力されました。
それもそのはずです。
作成したIAMロールにIAMへの参照ポリシーは全く設定していないので、そりゃアクセスできないよねとエラーになります。
そもそも
IAMロールを作成するプロジェクトと実際のリソースを作成するプロジェクトを一緒にしていました。
がよろしくないのですが、もしやるとすれば以下のようにポリシーを設定すればリソースを作成できるようになります。
{
"Statement": [
{
"Action": [
"ec2:*",
"ssm:*",
"sqs:*",
"iam:GetOpenIDConnectProvider",
"iam:GetPolicy",
"iam:GetPolicyVersion",
"iam:GetRole",
"iam:ListRolePolicies",
"iam:ListAttachedRolePolicies"
],
"Effect": "Allow",
"Resource": "*"
}
],
"Version": "2012-10-17"
}
これは悪い例ですので、チュートリアルのように
IAMロールを作成するプロジェクトと実際のリソースを作成するプロジェクト
は分けましょう。
Discussion