S-JIS[2013-05-23/2014-01-16] 変更履歴

Amazon EMR IAMロール

AWS EMRIAMロールのメモ。


IAMロール

EMRを使う為の最小限のIAMロールは以下の通り。

{
  "Statement": [
    {
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::自分のバケット"
      ]
    },
    {
      "Action": [
        "s3:DeleteObject",
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::自分のバケット/*"
      ]
    }
  ]
}

自分のバケット配下のファイルをEMRで読み書きする想定。

なお、ec2やcloudwath(さらにはelasticmapreduceも)といったアクションを一切指定していない (指定しないと不許可になるはずだ)が、それでも動く。

    {
      "Action": [
        "elasticmapreduce:*",
        "ec2:*",
        "cloudwatch:*"
      ],
      "Effect": "Allow",
      "Resource": "*"
    },

どうやら、これらの指定はEMR用のEC2インスタンスからアクションを行うときの権限だと思われる。
そういったアクションを行わないなら、権限の許可も不要だというわけ。
cloudwatchに関しては権限が無いとメトリクスの収集も行われないんじゃないかと思ったが、ちゃんと収集される。


EMR起動時にelastic-mapreduceコマンドにブートストラップアクションを指定する場合は、『elasticmapreduce』バケットへのアクセス許可が必要。

elastic-mapreduce 〜 \
--bootstrap-action s3://elasticmapreduce/bootstrap-actions/run-if \
--args "instance.isMaster=true,s3n://自分のバケット/bootstrap-actions/bootstrap.sh"
{
  "Statement": [
    {
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::elasticmapreduce",
        "arn:aws:s3:::自分のバケット"
      ]
    },
    {
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::elasticmapreduce/*"
      ]
    },
    {
      "Action": [
        "s3:DeleteObject",
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::自分のバケット/*"
      ]
    }
  ]
}

EMR起動時にelastic-mapreduceコマンドに「--enable-debugging」を指定してデバッグモードにしている場合は
「Setup Hadoop Debugging」ステップで『ap-northeast-1.elasticmapreduce』バケットのファイルを使っているようなので、それのアクセス許可が必要。

elastic-mapreduce 〜 \
--enable-debugging
使用箇所 使用ファイル
jar s3://ap-northeast-1.elasticmapreduce/libs/script-runner/script-runner.jar
args s3://ap-northeast-1.elasticmapreduce/libs/state-pusher/0.1/fetch
{
  "Statement": [
    {
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::ap-northeast-1.elasticmapreduce",
        "arn:aws:s3:::自分のバケット"
      ]
    },
    {
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::ap-northeast-1.elasticmapreduce/*"
      ]
    },
    {
      "Action": [
        "s3:DeleteObject",
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::自分のバケット/*"
      ]
    }
  ]
}

『elasticmapreduce』と『ap-northeast-1.elasticmapreduce』の両方のバケットを指定すると、以下のようになる。

{
  "Statement": [
    {
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::elasticmapreduce",
        "arn:aws:s3:::ap-northeast-1.elasticmapreduce",
        "arn:aws:s3:::自分のバケット"
      ]
    },
    {
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::elasticmapreduce/*",
        "arn:aws:s3:::ap-northeast-1.elasticmapreduce/*"
      ]
    },
    {
      "Action": [
        "s3:DeleteObject",
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::自分のバケット/*"
      ]
    }
  ]
}

ここで、以下の様に「elasticmapreduce」部分にワイルドカードを付けてまとめて書くことも出来るのだが、それはしない方が良いと思う。

{
  "Statement": [
    {
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::*elasticmapreduce",
        "arn:aws:s3:::自分のバケット"
      ]
    },
    {
      "Action": [
        "s3:GetObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::*elasticmapreduce/*",
      ]
    },
    {
      "Action": [
        "s3:DeleteObject",
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::自分のバケット/*"
      ]
    }
  ]
}

こうすると、例えば「zzz-elasticmapreduce」といった独自に作ったバケットにもアクセス可能になってしまう。
わざわざIAMロールでアクセス制限をするんだから、こういうのはアウトだろう。


IAMユーザーのEMRコンソール

IAMユーザーのポリシーにEMRのフル権限を付けても、EMRコンソールのジョブフロー一覧に何も表示されないことがある。[2014-01-16]

IAMユーザーのポリシー:

{
  "Statement": [
    {
      "Action": [
        "elasticmapreduce:*"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}

IAMユーザーでEMRのジョブフローを作成する際、デフォルトではEMRを起動したユーザーのEMRコンソールのみにジョブフローが表示されるらしい。
つまり、EMRの権限を持っていても、他ユーザーのジョブフローを見ることが出来ない。

EMRのジョブフローを作成する際に他ユーザーにも見せるかどうかを指定するオプション(visible-to-all-users)があるので、それを付けると他ユーザーからも見えるようになる。


EMRへ戻る / AWSへ戻る / 技術メモへ戻る
メールの送信先:ひしだま