kakakakakku blog

Weekly Tech Blog: Keep on Learning!

MOTO_IAM_LOAD_MANAGED_POLICIES: Moto で IAM マネージドポリシーを読み込む

Moto に登録されている IAM マネージドポリシーは実際に AWS から取得された設定になっていて,頻度高く(毎月)更新されている👌しかしパフォーマンス的な観点からデフォルトでは読み込まれないようになっている.

$ docker run --rm -p 5000:5000 --name moto motoserver/moto

$ aws iam list-policies --endpoint-url http://localhost:5000
{
    "Policies": []
}

ドキュメントには以下のように書いてある📝(翻訳付き)

Moto comes bundled with all Managed Policies that AWS exposes, which are updated regularly. However, they are not loaded unless specifically requested for performance reasons.(Moto には AWS が提供するすべてのマネージドポリシーがバンドルされており、定期的に更新されます。ただし、パフォーマンス上の理由により、特別にリクエストされない限りロードされません。)

docs.getmoto.org

環境変数 MOTO_IAM_LOAD_MANAGED_POLICIES

Moto (Server Mode) を起動するときに環境変数 MOTO_IAM_LOAD_MANAGED_POLICIEStrue を設定すると IAM マネージドポリシーを読み込める❗️Moto を使って IaC (Infrastructure as Code) のデプロイテストをするときなどに AWS アカウントと同じ IAM マネージドポリシーが必要になる場合があって,そういうときに使える.

$ docker run --rm -p 5000:5000 --name moto -e MOTO_IAM_LOAD_MANAGED_POLICIES=true motoserver/moto

件数を確認したところ「1336個」あった.

$ aws iam list-policies --endpoint-url http://localhost:5000 | jq '.Policies | length'
1336

代表的な AdministratorAccessAmazonEC2ReadOnlyAccess も確認できた👌

$ aws iam list-policies --endpoint-url http://localhost:5000 | jq '.Policies[] | select(.PolicyName == "AdministratorAccess")'
{
  "PolicyName": "AdministratorAccess",
  "PolicyId": "ASV3KCRP8P9EF8JCZH3FD",
  "Arn": "arn:aws:iam::aws:policy/AdministratorAccess",
  "Path": "/",
  "DefaultVersionId": "v1",
  "AttachmentCount": 0,
  "CreateDate": "2015-02-06T18:39:46+00:00",
  "UpdateDate": "2015-02-06T18:39:46+00:00"
}

$ aws iam list-policies --endpoint-url http://localhost:5000 | jq '.Policies[] | select(.PolicyName == "AmazonEC2ReadOnlyAccess")'
{
  "PolicyName": "AmazonEC2ReadOnlyAccess",
  "PolicyId": "AV4J8YWO42XOGCRDHY6GO",
  "Arn": "arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess",
  "Path": "/",
  "DefaultVersionId": "v3",
  "AttachmentCount": 0,
  "CreateDate": "2015-02-06T18:40:17+00:00",
  "UpdateDate": "2024-12-27T10:07:06+00:00"
}

aws iam get-policy-version コマンドを使って AmazonEC2ReadOnlyAccess のポリシードキュメントも確認できた👌

$ aws iam get-policy-version --endpoint-url http://localhost:5000 \
  --policy-arn arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess \
  --version-id v3
{
    "PolicyVersion": {
        "Document": {
            "Statement": [
                {
                    "Action": [
                        "ec2:Describe*",
                        "ec2:GetSecurityGroupsForVpc"
                    ],
                    "Effect": "Allow",
                    "Resource": "*"
                },
                {
                    "Action": "elasticloadbalancing:Describe*",
                    "Effect": "Allow",
                    "Resource": "*"
                },
                {
                    "Action": [
                        "cloudwatch:ListMetrics",
                        "cloudwatch:GetMetricStatistics",
                        "cloudwatch:Describe*"
                    ],
                    "Effect": "Allow",
                    "Resource": "*"
                },
                {
                    "Action": "autoscaling:Describe*",
                    "Effect": "Allow",
                    "Resource": "*"
                }
            ],
            "Version": "2012-10-17"
        },
        "VersionId": "v3",
        "IsDefaultVersion": true,
        "CreateDate": "2024-12-27T10:07:06+00:00"
    }
}

GitHub Actions

Moto は GitHub Actions を定期的に実行して実際の AWS アカウントから IAM マネージドポリシーを取得している.GitHub Actions ワークフロー .github/workflows/data-update_iam-managed-policies.yml から Makefile 経由で scripts/update_managed_policies.py を実行して,moto/iam/aws_managed_policies.py を更新している感じ〜❗️

実装を追っていくと仕組みまで理解できてイイ😀

関連記事

kakakakakku.hatenablog.com