機密設定データを AWS Secrets Manager に保存する - Amazon EMR

機密設定データを AWS Secrets Manager に保存する

Amazon EMR では、カスタム設定データ (DescribeClusterListInstanceGroups など) を発行する API オペレーションをプレーンテキストで記述して一覧表示できます。Amazon EMR は AWS Secrets Manager と統合されているため、Secrets Manager にデータを保存して、シークレット ARN を設定で使用できます。この方法を取ると、機密性の高い設定データをプレーンテキストで Amazon EMR に渡して外部 API に公開しなくても済みます。キーと値のペアに Secrets Manager に保存しているシークレットの ARN が含まれていることを示すと、設定データをクラスターに送信するときに、そのシークレット ARN が取得されます。外部 API を使用して設定を表示する場合、それに関するアノテーションは送信されません。

シークレットを作成する

シークレットを作成するには、「AWS Secrets Manager ユーザーガイド」の「AWS Secrets Manager シークレットを作成する」の手順に従います。ステップ 3 では、[プレーンテキスト] フィールドを選択して機密値を入力する必要があります。

Secrets Manager では、最大 65536 バイトをシークレットで指定できますが、Amazon EMR では、プロパティキー (アノテーションを除く) と取得するシークレット値を合わせた長さが 1024 文字に制限されていることに注意してください。

Amazon EMR にアクセス権を付与してシークレットを取得する

Amazon EMR では、IAM サービスロールを使用してクラスターをプロビジョニングおよび管理します。Amazon EMR に許可するアクションは Amazon EMR のサービスロールによって定義します。これにより、リソースをプロビジョニングすると共に、クラスター内で稼働している Amazon EC2 インスタンスのコンテキスト上、実行されないサービスレベルのタスクを実行できます。サービスロールの詳細については、「Amazon EMR のサービスロール (EMR ロール)」と「IAM ロールのカスタマイズ」を参照してください。

Amazon EMR が Secrets Manager からシークレット値を取得できるようにするには、クラスターを起動するときに Amazon EMR ロールに次のポリシーステートメントを追加します。

{ "Sid":"AllowSecretsRetrieval", "Effect":"Allow", "Action":"secretsmanager:GetSecretValue", "Resource":[ "arn:aws:secretsmanager:<region>:<aws-account-id>:secret:<secret-name>" ] }

カスタマー管理の AWS KMS key でシークレットを作成する場合は、使用するキーの Amazon EMR ロールに kms:Decrypt アクセス権限を追加する必要もあります。詳細については、AWS Secrets Manager ユーザーガイドの「AWS Secrets Manager に対する認証とアクセスコントロール」を参照してください。

シークレットを設定分類で使用する

EMR.secret@ アノテーションを任意の設定プロパティに追加して、そのキーと値のペアに、Secrets Manager に保存しているシークレットの ARN が含まれていることを示すことができます。

次の例は、設定分類でシークレット ARN を指定する方法を示しています。

{ "Classification":"core-site", "Properties":{ "presto.s3.access-key":"<sensitive-access-key>", "EMR.secret@presto.s3.secret-key":"arn:aws:secretsmanager:<region>:<aws-account-id>:secret:<secret-name>" } }

クラスターの作成時にアノテーション付きの設定を送信すると、Amazon EMR によって設定プロパティが検証されます。設定が有効な場合、Amazon EMR は、設定からアノテーションを削除し、Secrets Manager からシークレットを取得します。これによって、実際の設定を作成し、クラスターに適用します。

{ "Classification":"core-site", "Properties":{ "presto.s3.access-key":"<sensitive-access-key>", "presto.s3.secret-key":"<my-secret-key-retrieved-from-Secrets-Manager>" } }

DescribeCluster などのアクションを呼び出すと、Amazon EMR から、クラスターで現在稼働しているアプリケーションの設定が返ります。アプリケーション設定プロパティにシークレット ARN が含まれるとマークしている場合、DescribeCluster 呼び出しによって返るアプリケーション設定には、シークレット値ではなく ARN が含まれています。これにより、クラスター上でのみシークレット値を目視できるようになります。

{ "Classification":"core-site", "Properties":{ "presto.s3.access-key":"<sensitive-access-key>", "presto.s3.secret-key":"arn:aws:secretsmanager:<region>:<aws-account-id>:secret:<secret-name>" } }

シークレット値を更新する

Amazon EMR は、アタッチされたインスタンスグループが起動、再設定、またはサイズ変更されるたびに、アノテーション付きの設定からシークレット値を取得します。稼働中のクラスターの設定で使用するシークレット値は、Secrets Manager を使用すると変更できます。その場合、更新済みの値を受け取りたい各インスタンスグループに、再設定リクエストを送信できます。インスタンスグループを再設定する方法と、その際に考慮すべき点の詳細については、「実行中のクラスター内のインスタンスグループの再設定」を参照してください。