1. ホーム
  2. amazon-web-services

[解決済み] リクエストに含まれるセキュリティトークンの有効期限が切れている

2022-02-17 16:49:56

質問

社内報告用に、Cloudwatchから多くのメトリクスを取得するスクリプトがあります。

スクリプトは、特定の地域のすべてのEC2インスタンスを繰り返し、過去2週間の5つのクラウドウォッチメトリクス(利用可能なすべての統計)を求める(毎回5日前、5分間隔で、これはちょうど1440クォータである)。私は想定されるセッションを使用しています。

session = Session(aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCESS_KEY, region_name=regionName)
sts = session.client('sts')
response = sts.assume_role(
    RoleArn=arn, # External role arn
    RoleSessionName='role-name',
    ExternalId='<some-id-here>',
)
tempAccessKeyId = response['Credentials']['AccessKeyId']
tempSecretAccessKey = response['Credentials']['SecretAccessKey']
tempSessionToken = response['Credentials']['SessionToken']
assumedSession = Session(
    aws_access_key_id=tempAccessKeyId,
    aws_secret_access_key=tempSecretAccessKey,
    aws_session_token=tempSessionToken,
    region_name=regionName)

スクリプトを実行すると、次のような例外が発生しました。

botocore.exceptions.ClientError: An error occurred (ExpiredToken) when calling the GetMetricStatistics operation: The security token included in the request is expired

スクリプトの実行中にトークンが失効しないようにする方法はありますか?boto3を使っています。

どのように解決するのですか?

使用しているassume_roleメソッドは、以下を返します。 一時的 のセキュリティ認証が必要です。から取得します。 公式ドキュメント :

一時的なセキュリティ資格情報は、AssumeRole の呼び出し時に指定した期間、900 秒 (15 分) から 3600 秒 (1 時間) の範囲で有効です。デフォルトは1時間です。

を使用していないため DurationSeconds キーワード引数を指定すると、返された認証情報はデフォルトの1時間だけ有効です。1時間後にリクエストを行うには、新しいクレデンシャルを必ず取得する必要があります。の以下を参照してください。 Temporary Security Credentials 公式ドキュメント :

一時的なセキュリティ認証情報の有効期限が切れたとき(またはその前でも)、要求したユーザーがまだそのための権限を持っている限り、ユーザーは新しい認証情報を要求することができます。