Boto3で特定のAPIが使えない時に確認したい、AWS サービスのカスタムモデルデータ

Boto3を使っていて、使ってるBoto3やbotocoreのバージョンは古くないはずなのに特定のAPIが呼べないということがありました。~/.aws/modelsを確認したところ、特定のAPIが使えなかったサービスのモデルファイル(JSON)が入っており、そのファイルを削除することで、特定のAPIが使えないという問題が解決しました。どうやら以前、そのサービスのモデルファイルを追加し、削除し忘れていたようです。折角なので、今回はモデルファイルの追加と削除を試してみました。

概要

botocoreのbotocore/dataにはJSON形式でモデルデータが定義されています。AWS CLIやBoto3はこのモデルデータを参照し、どういうAWSサービスが存在して、それぞれにどういう操作が可能で、操作に使用するデータはどういう形式かという情報を得ます。

botocoreではモデルデータを読み込むデフォルトのパスとして、botocore/dataの他に~/.aws/modelsが定義されています。~/.aws/modelsはカスタム用のモデルデータの配置場所です。AWS CLIのadd-modelによって追加されたモデルデータは~/.aws/modelsに保存されます。

やってみる

モデルデータの作成

今回はEC2のモデルを元に検証用のモデルデータを作成します。

{
    "version": "2.0",
    "metadata": {
        "apiVersion": "2016-11-15",
        "endpointPrefix": "ec2",
        "protocol": "ec2",
        "serviceAbbreviation": "Amazon EC2",
        "serviceFullName": "Amazon Elastic Compute Cloud",
        "serviceId": "EC2",
        "signatureVersion": "v4",
        "uid": "ec2-2016-11-15",
        "xmlNamespace": "http://ec2.amazonaws.com/doc/2016-11-15"
    },
    "operations": {
        "CreateHogehoge": {
            "name": "CreateHogehoge",
            "http": {
                "method": "POST",
                "requestUri": "/"
            },
            "input": {
                "shape": "CreateHogehogeRequest"
            },
            "output": {
                "shape": "CreateHogehogeResult"
            },
            "documentation": "<p>Creates a hogehoge</p>"
        }
    },
    "shapes": {
        "CreateHogehogeRequest": {
            "type": "structure",
            "members": {
            }
        },
        "CreateHogehogeResult": {
            "type": "structure",
            "members": {
            }
        }
    },
    "documentation": "<fullname>Amazon Elastic Compute Cloud</fullname>"
}

モデルの追加

AWS CLIでモデルを追加します。--service-modelではモデルファイルを指定するんですが、file://からはじまるフルパスで指定する必要があります。--service-nameは必須の引数ではないんですが、指定して名前をつけることで既存のモデルへの上書きを避けることができます。ここでもしサービス名を指定せず、EC2としてモデルが登録されると、カスタムモデルの方が優先して読み込まれるため、既存のEC2のモデルが上書きされることになります。その場合は追加したモデルデータを削除することで、元に戻ります。

aws configure add-model --service-model file://`pwd`/ec2.json --service-name ec2-2

モデルを追加した後は、AWS CLIやBoto3で指定できるようになります。今回定義した操作create-hogehogeはAWS側のAPIが対応していないので、エラーが発生します。

aws ec2-2 create-hogehoge

Boto3でも同様に試してみると、クライアントを作成することはできますが、AWS側のAPIが対応していないので、create_hogehoge()を実行するとエラーが発生しました。

import boto3
ec2_2 = boto3.client('ec2-2')
ec2_2.create_hogehoge()

~/.aws/modelsを確認してみると、先ほど追加したモデルが配置されています。

ls -R ~/.aws/models

モデルの削除

モデルの削除についてはコマンドが見つかりませんでした。少々強引ですが、~/.aws/models/配下の対象とするモデルデータを削除することで、モデルを削除することができます。

rm -r ~/.aws/models/ec2-2

モデルを削除したので、ec2-2 create-hogehogeは使えなくなりました。

aws ec2-2 create-hogehoge

さいごに

モデルの追加は自らの手でしか行えないものだとは思いますが、忘れてしまうこともあるかと思います。AWS CLIやBoto3の挙動がおかしいなと思った際はモデルが上書きされていないかを確認してみると良いかもしれません。

参考