E-MapReduceのMetaServiceについて


今回の記事はアリババクラウドのビッグデータ処理サービスE-MapReduceについて、触れさせていただきたいと思います。

E-MapReduceは2.1.0 versionから、MetaServiceと呼ばれる機能をサポートするようになりましたが、業務上まだ利用されたことがない方がいらっしゃっるかと思いますので、その機能が一体なにできるのかを皆んさんに共有させて頂きたいです。

MetaServiceとは

一言でいうと、MetaServiceはE-MapReduceのRAMロールに一時的なセキュアトークンを払い出すウェブサービスです。その他、E-MapReduceクラスタの所属リージョンや、所属ネットワークタイルなどの情報を示すこともできます。

なぜMetaService必要なのか

MetaServiceが出る前に、MapReduceやHive、Sparkなどでジョブを開発する際に、ユーザーアカンウトのAccessKeyId及びAccessKeySecretを明示的に設定ファイルやコマンドパラメータなどに書かなければいけないですが、もちろん、セキュリティに情報漏洩のリスクが存在しております。

例えば、MapReduceの場合、下記のようなの入力を避けるができませんでした。

conf.set("fs.oss.accessKeyId", "${accessKeyId}");
conf.set("fs.oss.accessKeySecret", "${accessKeySecret}");
conf.set("fs.oss.endpoint","${endpoint}");

E-MapReduceクラスタ上にも、OSSのファイルを読み書きする際に、下記のようなAccessKeyIdとAccessKeySecret付きのURLを指定しなければなりませんでした。

hadoop fs -ls oss://[accessKeyId:accessKeySecret@]bucket[.endpoint]/object/path

このような課題を解決してくれるのがMetaServiceを利用したE-MapReduceアプリケーションロール (AliyunEmrEcsDefaultRole)です。デフォルトでは、クラスタを作成するときに、AliyunEmrEcsDefaultRole及びバインドする権限ポリシーが自動的に付与されるので、別にユーザー自身が作業する必要がありません。

ポリシードキュメントと権限付与ポリシーは以下となりますが、ご覧のように、OSSへアクセスアクションが与えられました。また必要に応じて、OSSへアクセス権限を調整したり(例えば、特定ディレクトリのみへのアクセスを制限したい場合)、LogServiceなど他のサービスへのアクセス権限を付与したりすることも可能です。

{
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "emr.aliyuncs.com"
        ]
      }
    }
  ],
  "Version": "1"
}

{
  "Version": "1",
  "Statement": [
    {
      "Action": [
        "oss:GetObject",
        "oss:ListObjects",
        "oss:PutObject",
        "oss:DeleteObject",
        "oss:ListBuckets",
        "oss:AbortMultipartUpload"
      ],
      "Resource": "*",
      "Effect": "Allow"
    }
  ]
}

MetaServiceによって、MapReduceやSparkなどの開発を行う際に、上記のように、AccessKeyId及びAccessKeySecretを入力する必要がなくなりました。また、クラスタ上で、OSSへサクセスする際にも、AccessKeyIdとAccessKeySecret付きのURLの指定も必要なく、Hadoopに慣れ親しんだユーザーが容易にコマンドを記述することができました。
hadoop fs -ls oss://bucket/path
hadoop fs -cp oss://bucket/path1 oss://bucket/path2

まとめ

いかがでしたでしょうか、MetaServiceを使い、ロールに必要な権限だけを付与することで、AccessKeyId及びAccessKeySecret漏洩のリスクを減らすだけではなく、ユーザーエクスペリエンスの向上にも繋がります、特に、OSS リソースに対話的にアクセスする場合に、OSS パスの長い文字列のURLを書く必要もなくなりましたので、皆さんぜひご活用してください。