💻

Terraform moduleを使いながら、IAMロール認証をしようと思ったら変なところで悩んだ

2024/02/08に公開

こちら方の記事が大変わかりやすかったので、参考にさせていただきました。

我流で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つの用途があるようです。

  1. 子モジュールから親モジュールに値を渡す
  2. ルートモジュールからのoutputをCLI出力する
  3. 他のプロジェクトを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ロールを作成するプロジェクトと実際のリソースを作成するプロジェクト

は分けましょう。

SMARTCAMP Engineer Blog

Discussion