Amazon EC2 で Java アプリケーションを実行している時に発生する「The security token included in the request is expired」(リクエストに含まれているセキュリティトークンの有効期限が切れています) エラーを解決するにはどうすればよいですか?

最終更新日: 2020 年 8 月 27 日

AWS SDK for Java を使用する Amazon Elastic Compute Cloud (Amazon EC2) インスタンスで実行されている Java アプリケーションで、以下のような例外が発生しています。

com.amazonaws.AmazonServiceException: The security token included in the request is expired (Service: AmazonSQS; Status Code: 403; Error Code: ExpiredToken; Request ID: 12a345b6-78cd-901e-fg23-45hi67890jkl)

簡単な説明

アマゾン ウェブ サービス (AWS) に対するすべてのアプリケーション API リクエストは、AWS によって発行された認証情報を使用して暗号署名されている必要があります。

アプリケーションが AWS クライアントの作成時に一時的な認証情報を使用すると、その認証情報は、クライアントの作成中に、指定された時間間隔で有効期限が切れます。認証情報は、有効期限が切れる前に更新する必要があります。

有効期限が切れるもうひとつの理由は、誤った時間の使用です。一貫性がある正確なタイムリファレンスは、多くのサーバータスクとプロセスにとって必要不可欠です。インスタンスの日付と時刻が正しく設定されていなければ、AWS の認証情報は拒否されます。

アプリケーションが Amazon EC2 インスタンスで実行されている場合は、インスタンスに割り当てられた AWS Identity and Access Management (IAM) ロールを使用することがベストプラクティスです。IAM ロールを使用することにより、デフォルトのサービスコンストラクタを使用できるようになります。デフォルトのコンストラクタクライアントは、次の順序で、デフォルトの認証情報プロバイダーチェーンを使用して認証情報を検索します。

  1. システム環境変数: AWS_ACCESS_KEY_ID および AWS_SECRET_ACCESS_KEY
  2. Java システムプロパティ: aws.accessKeyId および aws.secretKey
  3. デフォルトの認証情報ファイル (このファイルの場所はプラットフォームに応じて異なります)。
  4. EC2 インスタンスの IAM ロールに関連付けられたインスタンスメタデータに含まれるインスタンスプロファイルの認証情報。インスタンスプロファイルをインスタンスにアタッチすることにより、デフォルトの認証情報プロバイダーチェーンにインスタンスプロファイルの認証情報が追加されます。詳細については、「Amazon EC2 インスタンスで実行されるアプリケーションに IAM ロールを使用してアクセス許可を付与する」を参照してください。
    インスタンスプロファイルの認証情報を使用できる場合、デフォルトのクライアントコンストラクタが AWS SDK InstanceProfileCredentialsProvider クラスのインスタンスを作成します。AWS は、Amazon EC2 インスタンスメタデータからの一時的なセキュリティ認証情報を使用して AWS の認証情報で API リクエストに署名するために、このクラスを使用します。

重要: アプリケーションが一時的な AWS 認証情報の提供に AWS SDK ProfileCredentialsProvider を使用する場合、有効期限が切れる前に認証情報をチェックして更新することに対する責任はユーザーが負うことになります。資格情報をチェックして更新しなければ、ExpiredToken エラーによって生じるアプリケーション障害の可能性が高くなる場合があります。

解決方法

Amazon Time Sync Service または NTP ソースを使用する

Linux インスタンスに一貫性のある正確なタイムリファレンスがあることを確実にするには、Amazon Time Sync Service を設定、または Amazon EC2 インスタンスで別のネットワークタイムプロトコル (NTP) ソースを設定します。詳細については、「Linux インスタンスの時刻の設定、または Windows インスタンスの時刻を設定する」を参照してください。

カスタマイズされた一時的な AWS 認証情報を使用する

有効期限が切れる 5 分前に一時的な認証情報を更新します。

インスタンスに割り当てられた IAM ロールを使用する

インスタンスにインスタンスプロファイルをアタッチします。詳細については、「Amazon EC2 インスタンスで実行されるアプリケーションに IAM ロールを使用してアクセス許可を付与する」を参照してください。コードまたはインスタンスで他の認証情報が指定されていないことを確認します。インスタンスプロファイルの認証情報は、デフォルトの認証情報プロバイダーチェーンが認証情報を検索する最後の場所です。検索チェーンのこれより前の場所に認証情報がある場合、それらの認証情報によって IAM の使用が妨げられます。詳細については「AWS 認証情報の使用」を参照してください。

インスタンスにアタッチされている IAM ロールの AWS 認証情報を表示するには、Linux シェルまたは Windows PowerShell (v3.0 以降) から次のコマンドを実行します。examplerole はお使いの IAM ロールの名前に置き換えるようにしてください。

Linux の場合、curl コマンドを使用して AWS 認証情報を表示します。

$ 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"
}

Windows の場合は、Invoke-RestMethod コマンドを使用して AWS 認証情報を表示します。

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

このコマンドは、以下のような出力を返します。

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

これらのコマンドを使用して、インスタンスのための最新の一時的な認証情報を確認します。これらの認証情報は、割り当てられた一時的な認証情報の有効期限が切れる約 5 分前に、自動的にローテーションまたは更新されます。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術的なサポートが必要ですか?