kakakakakku blog

Weekly Tech Blog: Keep on Learning!

IAM で ELB の一部のアクションには ARN を指定できなかった

今日 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

docs.aws.amazon.com

docs.aws.amazon.com

まとめ

ちゃんと開発者ガイドを読もう!(自戒の念)

ただまぁ,もうちょっと適切なエラーメッセージが出ても良さそうだし,そもそも elasticloadbalancing:DescribeLoadBalancers を arn で制限できても良いのではないかなと思ったりもした.引き続き AWS CLI を使ってくぞ!