web-dev-qa-db-ja.com

リクエストに含まれているセキュリティトークンの有効期限が切れています

独自の内部レポートのために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を使用しています。

4
Avi

使用しているassume_roleメソッドは、temporaryセキュリティ資格情報を返します。以下は 公式ドキュメント から抜粋したものです。

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

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

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

8
Alon