Amazon EMR
管理ガイド

カスタム AMI の使用

Amazon EMR 5.7.0 以降を使用する場合は、Amazon EMR 用のデフォルトの Amazon Linux AMI ではなく、カスタム Amazon Linux AMI を指定できます。カスタム AMI は、以下を実行する場合に役立ちます。

  • ブートストラップアクションを使用する代わりにアプリケーションを事前インストールして他のカスタマイズを行う。これにより、クラスターの起動時間を短縮し、スタートアップのワークフローを合理化できます。詳細と例については、「事前設定したインスタンスからのカスタム Amazon Linux AMI の作成」を参照してください。

  • ブートストラップアクションが許可する以上の高度なクラスターおよびノード設定を実装する。

  • 5.24.0 以前の Amazon EMR バージョンを使用している場合、クラスターの EC2 インスタンスの EBS ルートデバイスボリューム(ブートボリューム)を暗号化します。詳細については、「暗号化された Amazon EBS ルートデバイスボリュームを使用したカスタム AMI の作成」を参照してください。

    注記

    Amazon EMR バージョン 5.24.0 から、キープロバイダーとして AWS KMS を指定すれば、セキュリティ設定オプションを使用して EBS ルートデバイスとストレージボリュームを暗号化できます。詳細については、「ローカルディスク暗号化」を参照してください。

ベストプラクティスと考慮事項

Amazon EMR のカスタム AMI を作成する場合は、以下の点を考慮してください。

  • Amazon Linux AMI を使用する必要があります。Amazon Linux 2 AMI はサポートされません。64 ビットの Amazon Linux AMI のみがサポートされています。複数の Amazon EBS ボリュームを持つ Amazon Linux AMI はサポートされていません。

  • 最新の EBS-backed Amazon Linux AMI に基づいてカスタマイズします。Amazon Linux AMI および対応する AMI ID のリストについては、Amazon Linux AMI を参照してください。

  • 既存の Amazon EMR インスタンスのスナップショットをコピーしてカスタム AMI を作成しません。これを行うと、エラーになります。

  • Amazon EMR と互換性がある HVM 仮想化タイプおよびインスタンスのみがサポートされます。Amazon EMR と互換する HVM イメージおよびインスタンスタイプを必ず選択して AMI のカスタマイズプロセスを進めます。互換性のあるインスタンスおよび仮想化タイプについては、「サポートされるインスタンスタイプ」を参照してください。

  • サービスロールには AMI での起動許可が必要であるため、AMI はパブリックであるか、ユーザーが AMI の所有者であるか、AMI を所有者と共有している必要があります。

  • AMI で作成するユーザーをアプリケーションと同じ名前 (hadoophdfsyarnspark など) にすると、エラーが発生します。

  • /tmp/var、および /emr のコンテンツ (AMI に存在する場合) はスタートアップ時にそれぞれ /mnt/tmp/mnt/var、および /mnt/emr に移動されます。ファイルは保持されますが、大量のデータがあると、スタートアップに予想以上の時間がかかる場合があります。

  • 作成日が 2018 年 8 月 11 日の Amazon Linux AMI に基づくカスタムの Amazon Linux AMI を使用している場合、Oozie サーバーは起動できません。Oozie を使用する場合は、Amazon Linux AMI ID に基づくカスタム AMI を別の作成日で作成します。次の AWS CLI コマンドを使用して、2018.03 バージョンのすべての HVM Amazon Linux AMI のイメージ ID のリストをリリース日とともに返すことができるため、適切な Amazon Linux AMI をベースとして選択することができます。MyRegion を、リージョン ID (us-west-2 など) と置き換えます。

    aws ec2 --region MyRegion describe-images --owner amazon --query 'Images[?Name!=`null`]|[?starts_with(Name, `amzn-ami-hvm-2018.03`) == `true`].[CreationDate,ImageId,Name]' --output text | sort -rk1

詳細については、『Linux インスタンス用 Amazon EC2 ユーザーガイド』の「Amazon EBS-Backed Linux AMI の作成」を参照してください。

カスタム AMI の指定

クラスターの作成時に AWS マネジメントコンソール、AWS CLI、Amazon CloudWatch、または Amazon EMR API を使用してカスタム AMI ID を指定できます。AMI が存在する AWS リージョンとクラスターを作成するリージョンは同じであることが必要です。

コンソールを使用してカスタム AMI を指定するには

  1. Amazon EMR コンソール (https://console.aws.amazon.com/elasticmapreduce/) を開きます。

  2. Choose Create cluster, Go to advanced options.

  3. [Software Configuration] の [Release] で、[emr-5.7.0] 以降を選択し、アプリケーションに必要なその他のオプションを選択します。[Next (次へ)] を選択します。

  4. [Hardware Configuration] でアプリケーションに適切な値を選択し、[Next] を選択します。

  5. [Additional Options] の [Custom AMI ID] に値を入力し、更新オプションは選択したままにします。更新オプションの変更の詳細については、「AMI パッケージリポジトリの更新の管理」を参照してください。

    
                            Amazon EMR カスタム AMI の選択。
  6. クラスターを起動するには、[Next] を選択してその他の設定オプションを完了します。

AWS CLI を使用してカスタム AMI を指定するには

  • --custom-ami-id コマンドの実行時に aws emr create-cluster パラメータを使用して AMI ID を指定します。

    次の例では、ブートボリュームが 20 GiB のカスタム AMI を使用するクラスターを指定しています。詳細については、「Amazon EBS ルートデバイスボリュームのサイズの指定」を参照してください。

    注記

    読みやすくするため、Linux の行連結文字 (\) を含めています。Linux コマンドでは、これらの文字は削除することも、使用することもできます。Windows の場合は、削除するか、キャレット (^) で置き換えます。

    aws emr create-cluster --name "Cluster with My Custom AMI" \ --custom-ami-id MyAmiID --ebs-root-volume-size 20 \ --release-label emr-5.7.0 --use-default-roles \ --instance-count 2 --instance-type m4.large

AMI パッケージリポジトリの更新の管理

デフォルトでは、Amazon Linux AMI は最初のブート時にパッケージリポジトリに接続し、他のサービスが起動する前にセキュリティ更新をインストールします。Amazon EMR のカスタム AMI の指定時に、必要に応じて、これらの更新を無効にすることを選択できます。この機能を無効にするオプションは、カスタム AMI を使用する場合にのみ使用できます。

警告

カスタム AMI を指定するときに、すべてのインストールされているパッケージを再起動時に更新することを選択するようお勧めします。パッケージを更新しないことを選択すると、他のセキュリティリスクが生じます。

AWS マネジメントコンソール では、[Custom AMI ID (カスタム AMI ID)] を選択するときに更新を無効にするオプションを選択できます。

AWS CLI では、create-cluster コマンドを使用するときに --repo-upgrade-on-boot NONE--custom-ami-id とともに指定できます。

Amazon EMR API では、RepoUpgradeOnBoot パラメータで NONE を指定できます。

事前設定したインスタンスからのカスタム Amazon Linux AMI の作成

Amazon EMR のカスタム Amazon Linux AMI を作成するためにソフトウェアを事前インストールして他の設定を行う基本的な手順は、次のとおりです。

  • ベース Amazon Linux AMI からインスタンスを起動します。

  • インスタンスに接続してソフトウェアをインストールし、他のカスタマイズを行います。

  • 設定したインスタンスの新しいイメージ (AMI スナップショット) を作成します。

カスタマイズ済みのインスタンスに基づいてイメージを作成したら、そのイメージを暗号化されたターゲットにコピーできます (「暗号化された Amazon EBS ルートデバイスボリュームを使用したカスタム AMI の作成」を参照)。

チュートリアル: カスタムソフトウェアがインストールされたインスタンスから AMI を作成する

最新の Amazon Linux AMI に基づいて EC2 インスタンスを起動するには

  1. AWS CLI を使用して次のコマンドを実行し、既存の AMI からインスタンスを作成します。MyKeyName をインスタンス接続時に使用したキーペアおよび適切な Amazon Linux AMI の ID の MyAmiId で置き換えます。最新の AMI ID に関しては、Amazon Linux AMI を参照してください。

    注記

    読みやすくするため、Linux の行連結文字 (\) を含めています。Linux コマンドでは、これらの文字は削除することも、使用することもできます。Windows の場合は、削除するか、キャレット (^) で置き換えます。

    aws ec2 run-instances --image-id MyAmiID \ --count 1 --instance-type m4.large \ --key-name MyKeyName --region us-west-2

    InstanceId出力値は、次のステップで MyInstanceId として使用します。

  2. 次のコマンドを実行します。

    aws ec2 describe-instances --instance-ids MyInstanceId

    PublicDnsName 出力値は、次のステップでインスタンスに接続するために使用します。

インスタンスに接続してソフトウェアをインストールするには

  1. SSH 接続を使用して Linux インスタンスでシェルコマンドを実行します。詳細については、『Linux インスタンス用 Amazon EC2 ユーザーガイド』の「SSH を使用した Linux インスタンスへの接続」を参照してください。

  2. 必要なカスタマイズを行います。以下に例を示します。

    sudo yum install MySoftwarePackage sudo pip install MySoftwarePackage

カスタマイズしたイメージからスナップショットを作成するには

暗号化された Amazon EBS ルートデバイスボリュームを使用したカスタム AMI の作成

Amazon EMR で Amazon Linux AMI の Amazon EBS ルートデバイスボリュームを暗号化するには、暗号化されていない AMI から暗号化されたターゲットにスナップショットイメージをコピーします。暗号化された EBS ボリュームの作成方法については、Linux インスタンス用 Amazon EC2 ユーザーガイドの「Amazon EBS 暗号化」を参照してください。スナップショットのソース AMI としてベース Amazon Linux AMI を使用できます。または、カスタマイズしたベース Amazon Linux AMI から派生した AMI からスナップショットをコピーできます。

注記

Amazon EMR バージョン 5.24.0 から、キープロバイダーとして AWS KMS を指定すれば、セキュリティ設定オプションを使用して EBS ルートデバイスとストレージボリュームを暗号化できます。詳細については、「ローカルディスク暗号化」を参照してください。

EBS ルートボリュームの暗号化には、外部キープロバイダーまたは AWS カスタマーマスターキー (CMK) を使用できます。Amazon EMR で使用するサービスロール (通常はデフォルトの EMR_DefaultRole) に対しては、Amazon EMR で AMI を使用してクラスターを作成するために、少なくともボリュームの暗号化と復号を許可する必要があります。AWS KMS をキープロバイダーとして使用する場合、以下のアクションを許可する必要があります。

  • kms:encrypt

  • kms:decrypt

  • kms:ReEncrypt*

  • kms:CreateGrant

  • kms:GenerateDataKeyWithoutPlaintext"

  • kms:DescribeKey"

これを行う最も簡単な方法としては、次のチュートリアルで説明するように、キーユーザーとしてロールを追加します。以下のポリシーステートメントの例は、ロールのポリシーをカスタマイズする必要がある場合に使用してください。

{ "Version": "2012-10-17", "Statement": [ { "Sid": "EmrDiskEncryptionPolicy", "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:CreateGrant", "kms:GenerateDataKeyWithoutPlaintext", "kms:DescribeKey" ], "Resource": [ "*" ] } ] }

チュートリアル: KMS CMK でのルートデバイスボリュームが暗号化されたカスタム AMI の作成

この例の最初のステップでは、KMS CMK の ARN を検索するか、新規作成します。キーの作成の詳細については、AWS Key Management Service Developer Guideの「キーの作成」を参照してください。次の手順では、デフォルトのサービスロール EMR_DefaultRole をキーユーザーとしてキーポリシーに追加する方法を示します。作成または編集するキーの ARN 値を書き留めます。後で AMI を作成するときに、この ARN を使用します。

コンソールを使用して Amazon EC2 のサービスロールを暗号化キーユーザーのリストに追加するには

  1. AWS マネジメントコンソール にサインインし、AWS Key Management Service (AWS KMS) コンソール (https://console.aws.amazon.com/kms) を開きます。

  2. AWS リージョンを変更するには、ページの右上隅にあるリージョンセレクターを使用します。

  3. 使用する CMK のエイリアスを選択します。

  4. [Key Users] のキーの詳細ページで、[Add] を選択します。

  5. [Attach (アタッチ)] ダイアログボックスで Amazon EMR サービスロールを選択します。デフォルトロールの名前は EMR_DefaultRole です。

  6. [アタッチ] を選択します。

AWS CLI を使用して暗号化された AMI を作成するには

  • AWS CLI の aws ec2 copy-image コマンドを使用して暗号化された EBS ルートデバイスボリュームとユーザーが変更したキーを持つ AMI を作成します。指定された --kms-key-id 値を、ユーザーが以前に作成または変更したキーの完全な ARN に置き換えます。

    注記

    読みやすくするため、Linux の行連結文字 (\) を含めています。Linux コマンドでは、これらの文字は削除することも、使用することもできます。Windows の場合は、削除するか、キャレット (^) で置き換えます。

    aws ec2 copy-image --source-image-id MyAmiId \ --source-region us-west-2 --name MyEncryptedEMRAmi \ --encrypted --kms-key-id arn:aws:kms:us-west-2:12345678910:key/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

コマンドの出力として、作成した AMI の ID が提供されます。この ID をクラスターの作成時に指定できます。詳細については、「カスタム AMI の指定」を参照してください。また、ソフトウェアをインストールし、他の設定を行うことにより、この AMI をカスタマイズすることもできます。詳細については、「事前設定したインスタンスからのカスタム Amazon Linux AMI の作成」を参照してください。