はじめに

RedShiftからデータを取得し、S3にCSVで出力するGlueジョブの処理時間が1時間を超過した際に以下エラーが発生。原因と対処について解説します。
com.amazon.redshift.util.RedshiftException: ERROR: S3ServiceException:The provided token has expired

原因

このエラーは、GlueジョブでRedShiftがS3にアクセスするための一時認証情報を使用している場合に発生します。
デフォルトではGlueジョブは、ジョブを実行するために指定したロールを使用して作成されたRedshift の一時認証情報を渡します。
この認証情報は、セキュリティ上の理由から1時間の有効期限を持ちます。
長時間実行されるジョブでは、この有効期限が切れると、アクセスが拒否され、ジョブが失敗する原因となります。

対処法

この問題を解決するには、Glueジョブを実行時に一時的な認証情報を使用するのではなく、RedshiftクラスターへS3への読み取り・書き込み許可が必要となる為、接続するRedshiftクラスターにIAM ロールを関連付けを行います。
関連付けを行うロールには、S3の一時ディレクトリからの読み取り、および一時ディレクトリへの書き込みを許可するポリシーとredshift.amazonaws.comにAssumeRole を許可する信頼関係を作成し、Redshift がロールを継承できるようにします。
その後Redshiftコンソールで、作成したロールを接続するRedshiftクラスターに関連付けます。

※以下Glueジョブの書き込みサンプル

redshift_conn_options = {
    "dbtable": "{Redshiftのテーブル名}",
    "database": "{RedshiftのDB名}",
    "aws_iam_role": "arn:aws:iam::{アカウントID}:role/{ロール名}"
}

glueContext.write_dynamic_frame.from_jdbc_conf(
    frame = input dynamic frame, 
    catalog_connection = "{コネクション名}", 
    connection_options = redshift_conn_options, 
    redshift_tmp_dir = "{S3一時ディレクトリパス}"

接続オプションである「aws_iam_role」に先ほどRedshiftクラスターに関連付けしたロールを設定する事で、一時認証では無くロールでの認証によってジョブを実行します。

まとめ

一時認証情報の扱いは、AWS GlueとRedshift間のデータ転送において重要な要素です。今回解説した適切なIAMロールの使用以外にも再試行ロジックの実装、データの分割処理、そしてGlueジョブの設定調整により、認証情報の期限切れによるエラーを効果的に回避できます。
これらの対策を実装することで、より安定したデータ処理パイプラインを構築し、大規模なデータセットでも信頼性の高い処理を実現できます。