AWS Python(Boto3) の例外処理について ClientError の場合の具体例

はじめに

前回書いたBoto3の例外処理を行う方法の記事を見返したら、だいぶ分かりづらいな...と思ったので本記事で ClientError の場合の具体例を記載しようと思います。
rioner2525.hatenablog.com

具体例

仮定

・S3バケット内のテキストファイル ( test.txt ) を Lambda で取得して、ファイルの内容を Lambda 内で更新してアップロードする。
・テキストファイルが存在しない場合は新規作成とする。

こういった仮定の場合はバケット内にテキストファイルが存在しているかチェックするより、直接取得することを試みてエラーが発生した場合に判断する方が可読性が高く処理速度も速いコードになると思います。
そのことを鑑みて具体例のコードは以下。

コード

コードの置き場所はここです。
boto3_error/lambda_function.py at master · rioner/boto3_error · GitHub

軽い解説

ClientError の場合は botocore.exceptions.ClientError でエラーをキャッチできます。
e.response['Error']['Code'] って何だよと思われるかもですが、こちらは公開されている botocore リポジトリの exceptions.py を見ていただければ分かるかもです。(389 ~ 415 行目)
https://github.com/boto/botocore/blob/develop/botocore/exceptions.py
例えば上記コード内のテキストファイルが存在しないパターンのエラー内容は以下のようになります。

print(e)
print(e.response['Error']['Code'])
print(e.response['Error']['Message'])
print(e.operation_name)

↓ 結果

An error occurred (404) when calling the HeadObject operation: Not Found
404
Not Found
HeadObject

というわけで実際に想定しているエラーを発生させてエラー内容を見て、except 内で条件分岐を行えばよいと思います。
例えば Lambda にアタッチされた実行ロールに S3 バケットへのアップロード権限が足りない場合のエラー文は An error occurred (AccessDenied) when calling the PutObject operation: Access Denied だったりするので、この場合は以下のように s3.meta.client.upload_file 関数部分にtry-except文でキャッチできると思います。

e.response['Error']['Code'] == 'AccessDenied':
    print('権限足りない')
    raise Exception(e)

以上です。
ClientError 以外のエラー内容まで分岐させる場合は前回の記事を参考に botocore リポジトリのエラー関連のプログラムを確認してください。