[Boto3 Adv-Cal DAY22]Boto3の例外対応をピックアップしてみた

boto3 で楽しむ AWS PythonLife 一人AdventCalendarです。22日目はBoto3での例外実装を行う際に手続きについてまとめてみました。
2018.12.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

boto3 で楽しむ AWS PythonLife 一人AdventCalendarです。

boto3のドキュメントを通して、サービス別にどういった事が出来るのかを理解したり、管理コンソールを通さずにTerminalだけで完結できるように検証していくことが目的になります。

22日目はBoto3の例外処理の辿り方と具体的な対応方法についてまとめてみました。

目次

例外への対応例の見つけ方

ざっくりと2つの方法があります。

  • Boto3のソースコードを辿る
  • Github等のリポジトリからWrapperプロジェクトを辿る

Boto3のソースコードを辿る

実質はbotocoreの処理を呼び出している状態になっています。botocoreからdataディレクトリ以下を辿り、該当する例外を見つけます。

ただし、全てJSONコードのため可視性はそこまで高くありません。そこで、Pythonコードによる呼び出しで例外Classを確認してみます。

import boto3
import pprint
pprint.pprint(boto3.client('s3').exceptions._code_to_exception.keys())
dict_keys(['BucketAlreadyExists', 'BucketAlreadyOwnedByYou', 'NoSuchBucket', 'NoSuchKey', 'NoSuchUpload', 'ObjectAlreadyInActiveTierError', 'ObjectNotInActiveTierError'])

判明したClassを用いて例外に対応した例です。

try:
    s3 = boto3.client('s3')
    ..
except s3.exceptions.BucketAlreadyExists as e:
    print(e)

この手続きを調べる際の難点は、直接関数として呼び出しが定義されているわけではないためにpydocで辿れないところです。ただ、若干手間はかかりますが、個別の的確な対応を行う場合は適していると思われます。

Github等のリポジトリからWrapperプロジェクトを辿る

Program Creek

OSSのリポジトリから特定の目的にそったコードを引用して評価するサイトです。実装の精度等に応じてvoteがなされます。botocoreについてもサンプルとしていくつかのリポジトリが引用されています。

Python botocore.exceptions() Examples

発生した例外クラスで検索して、実際の対処方法を参考にするという使い方になると思われます。

ただ、clientからのexceptions呼び出しを行っているケースが少なめで、JSONデータをもとにしているためにコード量は増えるかもしれません。

まとめ

boto3での例外の対応については、特にガイドラインというものは存在していないようです。

必要に応じてClientErrorからデータ参照するか、exceptionsから取得できる値を検証して直接対応するか、例外対応に掛けられるコストの見積もりが重要だと思われます。