boto3 で適切なエラー処理を行う方法を理解しようとしています。
IAM ユーザーを作成しようとしています:
def create_user(username, iam_conn):
try:
user = iam_conn.create_user(UserName=username)
return user
except Exception as e:
return e
create_user の呼び出しが成功すると、API 呼び出しの http ステータス コードと新しく作成されたユーザーのデータを含むきちんとしたオブジェクトを取得します。
例:
{'ResponseMetadata':
{'HTTPStatusCode': 200,
'RequestId': 'omitted'
},
u'User': {u'Arn': 'arn:aws:iam::omitted:user/omitted',
u'CreateDate': datetime.datetime(2015, 10, 11, 17, 13, 5, 882000, tzinfo=tzutc()),
u'Path': '/',
u'UserId': 'omitted',
u'UserName': 'omitted'
}
}
これはうまくいきます。しかし、これが失敗した場合 (ユーザーが既に存在する場合など) は、タイプ botocore.exceptions.ClientError のオブジェクトを取得し、テキストだけで何が問題なのかを教えてくれます。
例: ClientError('CreateUser 操作の呼び出し時にエラーが発生しました (EntityAlreadyExists): 名前が省略されたユーザーは既に存在します。',)
結果のhttpステータスコードをオンにすることはできないため、これ(AFAIK)はエラー処理を非常に困難にします(IAMのAWS APIドキュメントによると、ユーザーの409はすでに存在します)。これは、私が間違った方法で何かをしているに違いないと私に思わせます。最適な方法は、boto3 が例外をスローしないことですが、juts は常に API 呼び出しがどのように行われたかを反映するオブジェクトを返します。
誰かがこの問題について私を啓発したり、正しい方向に向けたりできますか?