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 が提供するすべてのマネージドポリシーがバンドルされており、定期的に更新されます。ただし、パフォーマンス上の理由により、特別にリクエストされない限りロードされません。)
環境変数 MOTO_IAM_LOAD_MANAGED_POLICIES
Moto (Server Mode) を起動するときに環境変数 MOTO_IAM_LOAD_MANAGED_POLICIES
に true
を設定すると 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
代表的な AdministratorAccess
や AmazonEC2ReadOnlyAccess
も確認できた👌
$ 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 を更新している感じ〜❗️
実装を追っていくと仕組みまで理解できてイイ😀