今日 IAM (AWS Identity and Access Management) のポリシーを書いてたんだけど,ELB (Elastic Load Balancing) のポリシーの仕様で基本的な勘違いをしていてハマった.開発者ガイドを読んだら全て書いてあったんだけど,自戒の念も含めて書いておく.
NG
まず,実行時にエラーになるポリシーの例を書いておく.記述してる通りで,特定の ELB に対して,4アクションを許可したかった.
- elasticloadbalancing:DeregisterInstancesFromLoadBalancer
- elasticloadbalancing:DescribeInstanceHealth
- elasticloadbalancing:DescribeLoadBalancers
- elasticloadbalancing:RegisterInstancesWithLoadBalancer
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "elasticloadbalancing:DeregisterInstancesFromLoadBalancer", "elasticloadbalancing:DescribeInstanceHealth", "elasticloadbalancing:DescribeLoadBalancers", "elasticloadbalancing:RegisterInstancesWithLoadBalancer" ], "Resource": [ "arn:aws:elasticloadbalancing:ap-northeast-1:0000000000000:loadbalancer/xxx" ] } ] }
ただし aws elb describe-load-balancers
を実行するとエラーになった.AccessDenied と表示されていて記述ミスかと思ったけど,IAM Policy Simulator でテストしたら allowed になって困った.
$ aws elb describe-load-balancers --load-balancer-name xxx --query LoadBalancerDescriptions[].Instances A client error (AccessDenied) occurred when calling the DescribeLoadBalancers operation: User: arn:aws:iam::0000000000000:user/xxx is not authorized to perform: elasticloadbalancing:DescribeLoadBalancers
OK
正しくはこう.仕様として elasticloadbalancing:DescribeLoadBalancers
に arn を書くことはできなかった.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "elasticloadbalancing:DescribeInstanceHealth", "elasticloadbalancing:DescribeLoadBalancers" ], "Resource": [ "*" ] }, { "Effect": "Allow", "Action": [ "elasticloadbalancing:DeregisterInstancesFromLoadBalancer", "elasticloadbalancing:RegisterInstancesWithLoadBalancer" ], "Resource": [ "arn:aws:elasticloadbalancing:ap-northeast-1:0000000000000:loadbalancer/xxx" ] } ] }
開発者ガイド
開発者ガイドを読んだらちゃんと書いてあった.ポリシーのサンプルも掲載されてた.むむむ.
次の API アクションでは特定のロードバランサーの ARN を指定できません。 * DescribeInstanceHealth * DescribeLoadBalancerAttributes * DescribeLoadBalancerPolicyTypes * DescribeLoadBalancers * DescribeLoadBalancerPolicies * DescribeTags
まとめ
ちゃんと開発者ガイドを読もう!(自戒の念)
ただまぁ,もうちょっと適切なエラーメッセージが出ても良さそうだし,そもそも elasticloadbalancing:DescribeLoadBalancers
を arn で制限できても良いのではないかなと思ったりもした.引き続き AWS CLI を使ってくぞ!