AWSのIAMを利用して、他のユーザが特定のリソースのみにアクセスできるようにしたいです。

様々なサイトを参考にしながらPolicyのJSONファイルを記述しているのですが、そのなかで以下の様な例みつかりました。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1373379896000",
      "Action": [
        "ec2:describe*"
      ],
      "Resource": [
        "*"
      ],
      "Effect": "Allow"
    },
    {
      "Sid": "Stmt1373381303000",
      "Action": [
        "ec2:RebootInstances",
        "ec2:StartInstances",
        "ec2:StopInstances",
        "ec2:TerminateInstances"
      ],
      "Resource": [
        "arn:aws:ec2:ap-northeast-1:0123456789:instance/i-e0123456"
      ],
      "Effect": "Allow"
    }
  ]
}

このPolicyを設定されたグループに所属するユーザは以下のことが可能になると思います。

  • 全てのEC2インスタンスを閲覧できる
  • 特定のインスタンス(i-e0123456)に対しReboot、Start、Stop,Terminateができる

しかし、今回は特定のインスタンスに対してすべての権限を与え、それ以外のインスタンスを閲覧できないようにしたいです。

Statement配列の1つ目のステートメントでは、ec2:describe*アクションが有効になっており、対象のリソースがResource:["*"]となっていますので、全てのEC2インスタンスに対しての閲覧権限を与えるという意味になるかと思います。

この設定のせいで、見せたくないインスタンスが閲覧できるようになってしまっていると思われるので、Resouce:["*"]を特定のインスタンスを指定するようにする必要があります。

しかし、そのようなリソースを指定しているステートメントはStatement配列の2つ目のステートメントに設定されていますので、こちらのActionec2:describe*を追加すれば良いということになります。

加えて、2番めのステートメントでは、ActionがRebootやStartなど特定のアクションのみの操作に限定されています。今回は特定のインスタンスに全てのアクション権限を与えたいと思っていますのでこちらのActionec2:*に変更します。

すると以下のようなPolicyJSONが出来上がります。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1373381303000",
      "Action": ["ec2:*"],
      "Resource": ["arn:aws:ec2:ap-northeast-1:0123456789:instance/i-e0123456"],
      "Effect": "Allow"
    }
  ]
}

しかし、上記のPolicyを設定されたアカウントでログインしてみても、インスタンスが一つも表示されず、目的の権限を与えることができていません。

試しに初めに記述したPolicyJSONを設定してみたところ、全てのインスタンスが表示されることが確認できました。

arnの記述方法としましては以下のようになっており

arn:aws:service:region:account:resource

今回、質問用に書き換えさせて頂いておりますが

arn:aws:ec2:ap-northeast-1:0123456789:instance/i-e0123456"

上記arnは

arn:aws:ec2:[リージョンのID]:[AWSアカウントのID]:instance/[インスタンスID]"

と認識しており、リージョンは東京リージョンを利用していて、AWSアカウントIDもインスタンスIDにも間違いがありません。

インスタンスの詳細を見てみたところ、リージョンがap-northeast-1aとなっていたので、aを付け加えてみたのですが、Policyの検証時にinvalid region for vendor ec2.というようなエラーが表示されてしまいました。

どこに間違いがあるのでしょうか?