Yappli Tech Blog

株式会社ヤプリの開発メンバーによるブログです。最新の技術情報からチーム・働き方に関するテーマまで、日々の熱い想いを持って発信していきます。

【小ネタ】Bing AIちゃんIAMポリシー作っといてよ!

こんにちは、SREグループのはぶちん(羽渕)です。
この夏から育てたミニトマト、いちごは順調に育っているのですが、きゅうりが枯れてしまいました😢
プランターの排水性が悪く根腐れしてしまったようです。農業はパラメーターが多くて難しいですね。

今回は小ネタですがサクッとIAMポリシーを作成出来て便利だったのでシェアしたいと思います。
ちなみに人に頼むときにタイトルにあるような言い方をするとシバかれると思うので気をつけてください。

とあるIAMポリシーを作りたくなった

Fargateのタスクが起動出来ない問題に遭遇し以下のトラブルシューティングを実施する際に、IAMポリシーのサンプルが記載されておらず、自前で作る必要が有り整形するのが面倒だなあと思っておりました。

AWSSupport-TroubleshootECSTaskFailedToStart - AWS Systems Manager オートメーション (自動化) ランブックリファレンス

そこで私はひらめきました。Bing AI Chatにまかせて見てはどうだろうかと。

Bing AIちゃんIAMポリシー作っといて

早速、Bing AI Chatに以下のプロンプトを入力してみました。

以下のアクションを許可するAWS IAMポリシーを作成してください
cloudtrail:LookupEvents
ec2:DeleteNetworkInterface
ec2:DescribeInstances
ec2:DescribeInstanceAttribute
ec2:DescribeIamInstanceProfileAssociations
ec2:DescribeSecurityGroups
ec2:DescribeNetworkAcls
ec2:DescribeNetworkInterfaces
ec2:DescribeRouteTables
ec2:DescribeSubnets
ec2:DescribeVpcEndpoints
ec2:DescribeVpcs
ecr:DescribeImages
ecr:GetRepositoryPolicy
ecs:DescribeContainerInstances
ecs:DescribeServices
ecs:DescribeTaskDefinition
ecs:DescribeTasks
iam:AttachRolePolicy
iam:CreateRole
iam:DeleteRole
iam:DetachRolePolicy
iam:GetInstanceProfile
iam:GetRole
iam:ListRoles
iam:PassRole
iam:SimulateCustomPolicy
iam:SimulatePrincipalPolicy
kms:DescribeKey
lambda:CreateFunction
lambda:DeleteFunction
lambda:GetFunctionConfiguration
lambda:InvokeFunction
lambda:TagResource
logs:DescribeLogGroups
logs:PutRetentionPolicy
secretsmanager:DescribeSecret
ssm:DescribeParameters
sts:GetCallerIdentity

返ってきた回答がこちら

AWS IAMポリシーを作成するには、以下のJSONを使用してください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudtrail:LookupEvents",
                "ec2:DeleteNetworkInterface",
                "ec2:DescribeInstances",
                "ec2:DescribeInstanceAttribute",
                "ec2:DescribeIamInstanceProfileAssociations",
                "ec2:DescribeSecurityGroups",
                "ec2:DescribeNetworkAcls",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DescribeRouteTables",
                "ec2:DescribeSubnets",
                "ec2:DescribeVpcEndpoints",
                "ec2:DescribeVpcs",
                "ecr:DescribeImages",
                "ecr:GetRepositoryPolicy",
                "ecs:DescribeContainerInstances",
                "ecs:DescribeServices",
                "ecs:DescribeTaskDefinition",
                "ecs:DescribeTasks",
                "iam:AttachRolePolicy",
                "iam:CreateRole",
                "iam:DeleteRole",
                "iam:DetachRolePolicy",
                "iam:GetInstanceProfile",
                "iam:GetRole",
                "iam:ListRoles",
                "iam:PassRole",
                "iam:SimulateCustomPolicy",
                "iam:SimulatePrincipalPolicy",
                "kms:DescribeKey",
                "lambda:CreateFunction",
                "lambda:DeleteFunction",
                "lambda:GetFunctionConfiguration",
                "lambda:InvokeFunction",
                "lambda:TagResource",
                "logs:DescribeLogGroups",
                "logs:PutRetentionPolicy",
                "secretsmanager:DescribeSecret",
                "ssm:DescribeParameters"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "sts:GetCallerIdentity"
            ],
            "Resource": "*"
        }
    ]
}

それそれー!
"Resource": "*" なのにstsだけ分ける必要も無いような気もしますが、期待通りのIAMポリシーが返ってきました!

感想

今まであんなことやこんなことをして整形していたのが、一瞬で出来てしまいました。
もちろんIAMポリシーの中身は人間が理解している必要はありますし、固有のリソース名などを入力する場合は注意が必要かもしれませんが、簡単な処理をお願いするのには良さそうですね。
シェルスクリプトを作成する時なんかにも、あのコマンドのオプションなんだっけ?をスキップして作成出来たりするのでおすすめです。

使い慣れた方には当たり前かもしれませんが、こういう活用も出来ますよ。と、いうことで書いてみました。
自分はちょっと出遅れ気味ですが、これからも活用できればと思います。

最後まで読んで頂きありがとうございました!ではではー