Amazon EC2 で Java アプリケーションを実行する際の、"リクエストに含まれるセキュリティトークンの有効期限が切れています" というエラーを解決する方法を教えてください。

所要時間2分
0

mazon Elastic Compute Cloud (Amazon EC2) インスタンス上の AWS SDK for Java を使用している Java アプリケーションで、次のエラーが発生します。"com.amazonaws.AmazonServiceException: リクエストに含まれるセキュリティトークンの有効期限が切れています (サービス: AmazonSQS; ステータスコード: 403; エラーコード: ExpiredToken; リクエスト ID: 12a345b6-78cd-901e-fg23-45hi67890jkl)"

簡単な説明

AWS では、すべてのアプリケーション API リクエストに AWS から提供された認証情報を使用してデジタル署名する必要があります。アプリケーションが一時的な認証情報を使用して AWS クライアントを作成する場合、有効期限が切れる前にこれらの認証情報を更新する必要があります。認証情報の有効期限が切れている場合は、「リクエストに含まれるセキュリティトークンが期限切れです」というエラーが表示されます。このエラーを解決するには、時間基準を確認し、期限切れの一時認証情報を更新してから、AWS Identity and Access Management (IAM) の設定を確認します。

解決策

インスタンスに一貫した時間基準が設定されていることを確認する

認証情報が誤った時間を使用している場合は期限切れとなるため、サーバーが正確であることを確認してください。EC2 インスタンスには、一貫性のある正確な時刻と日付の基準が必要です。インスタンスで Amazon Time Sync Service または、その他の Network Time Protocol (NTP) ソースを設定します。詳細については、「インスタンスのタイムゾーンを変更する」を参照してください。

一時的な認証情報が期限切れになっていないことを確認する

一時的な認証情報を使用する場合は、有効期限が切れていないことを確認してください。一時認証情報の有効期限が切れた場合は、新しい一時認証情報セットを生成して使用する必要があります。一時的な認証情報は、有効期限が切れる 5 分前に更新するのがベストプラクティスです。

IAM 設定を確認する

EC2 インスタンスで実行されるアプリケーションでは、そのインスタンスに割り当てられた IAM ロールを使用するのがベストプラクティスです。IAM ロールを使用する場合は、構成が正しく設定されていることを確認してください。

IAM ロールでは、デフォルトのサービスコンストラクタがデフォルトの認証情報プロバイダーチェーンを使用して、次の順序で認証情報を検索します。

  1. システム環境変数 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 内。
  2. Java のシステムプロパティ aws.accessKeyIdaws.secretKey 内。
  3. デフォルトの認証情報ファイル内。
  4. IAM ロールに関連付けられたインスタンスメタデータのインスタンスプロファイル認証情報内。

詳細については、「IAM ロールを使用して Amazon EC2 インスタンスで実行されるアプリケーションにアクセス許可を付与する」を参照してください。

インスタンスプロファイル以外の場所に認証情報を記述した場合、デフォルトのクライアントコンストラクターは、最初にそれらの認証情報を検索します。この設定により、IAM ロール認証情報はブロックされます。詳細については、「AWS SDK for Java に一時的な認証情報を提供する」を参照してください。

IAM ロールの認証情報を確認するには、Windows PowerShell バージョン 3.0 以降または Linux シェルから次のコマンドを実行します。一時認証情報を使用する場合、次の Windows および Linux コマンドはインスタンスの最新の一時認証情報を表示します。

注: 次のコマンドで、examplerole は実際の IAM ロールの名前に置き換えます。

Windows:

PS C:\> Invoke-RestMethod http://169.254.169.254/latest/meta-data/iam/security-credentials/examplerole

次の例のような出力が表示されます。

Code            : SuccessLastUpdated     : 2016-07-18T18:09:47Z
Type            : AWS-HMAC
AccessKeyId     : AKIAIOSFODNN7EXAMPLE
SecretAccessKey : wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Token           : token
Expiration      : 2016-04-27T22:39:16Z

Linux:

curl http://169.254.169.254/latest/meta-data/iam/security-credentials/examplerole

次の例のような出力が表示されます。

{    "Code" : "Success",
    "LastUpdated" : "2016-04-26T16:39:16Z",
    "Type" : "AWS-HMAC",
    "AccessKeyId" : "AKIAIOSFODNN7EXAMPLE",
    "SecretAccessKey" : "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
    "Token" : "token",
    "Expiration" : "2016-04-27T22:39:16Z"
}

上記の curl コマンドを実行して 404 エラーが表示された場合は、メタデータ IP アドレスで HTTP プロキシが無効であることを確認してくださいインスタンスプロファイルがインスタンスにアタッチされていることも確認してください。

問題が解決しない場合は、インスタンスが複数の同時リクエストを行っておらず、複数のセッションを並行して実行していないことを確認します。このシナリオでは、インスタンスメタデータサービス (IMDS) によるクエリのスロットリングが発生する場合があります。この問題を軽減するには、エクスポネンシャルバックオフパターンを使用して再試行します。

AWS_METADATA_SERVICE_NUM_ATTEMPTS を変更することで、再設定を設定します。環境変数、~/.aws/config ファイル、またはユーザーの botocore セッションを使用してオプションを設定します。詳細については、Boto3 ドキュメントのウェブサイトで「構成」を参照してください。

例:

AWS_METADATA_SERVICE_TIMEOUT = 10
AWS_METADATA_SERVICE_NUM_ATTEMPTS = 5

Docker コンテナで curl コマンドを実行する場合は、http-put-response-hop-limit2 に増やします。次の AWS コマンドラインインターフェイス (AWS CLI) コマンド modify-instance-metadata-options を実行します。

aws ec2 modify-instance-metadata-options --instance-id instance --http-put-response-hop-limit 2 --http-endpoint enabled

注: instance は、実際のインスタンス ID に置き換えます。AWS CLI のコマンドの実行時にエラーが発生する場合は、「AWS CLI でのエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

詳細については、「EC2 インスタンスメタデータサービスの機能強化による、オープンファイアウォール、リバースプロキシ、SSRF の脆弱性に対する詳細な防御の追加」を参照してください。

ロールの認証情報は、割り当てられた一時的な認証情報の有効期限が切れる 5 分前に自動的にローテーションまたは更新されます。

関連情報

SDK 認証を設定する

Amazon EC2 用の IAM ロール

AWS公式
AWS公式更新しました 5ヶ月前
コメントはありません

関連するコンテンツ