AWS::CLIWrapper-1.00 をリリースしました

先日 awscli が正式リリースされたので、

Perlのラッパーの AWS::CLIWrapper-1.00 をリリースしました。


awscli にはこれまで何度か互換性のない変更が行われており、不用意に awscli のバージョンを上げると古い awscli 向けに書いたスクリプトが動かなくなったりしていました。

正式リリースされたので、もうこうのような非互換変更は入らないだろうということで、できるだけ古いawscli向けに書いたスクリプトも新しいawscliで動くようにAWS::CLIWrapper側で非互換部分を吸収するようにしました。

awscli >= 0.14.0 は "Key", "Values", "Value", "Name" など先頭大文字のパラメータを要求する

filterやtagで使われるパラメータ名が、awscli < 0.14.0では"key", "values", "value", "name"と小文字だったのですが、0.14.0以降では先頭大文字になりました。

AWS::CLIWrapperは、awscliのバージョンを見て、内部的に大文字/小文字の変換します。

本来、このようなスクリプト

my $res = $aws->ec2('describe-instances' => {
    'filters' => [{ name => 'tag:Name', values => ["foo*"] }],
});

をawscli >= 0.14.0で動かすと(nameとvaluesが小文字なので)エラーになるのですが、AWS::CLIWrapper-1.00を使えば大丈夫です。

awscli >= 0.14.0 は ec2 run-instancesのパラメータに--countを要求する

awscli < 0.14.0では--min-countと--max-countだったのですが、>= 0.14.0では--count N or --count MIN:MAXに変わりました。

これもAWS::CLIWrapper-1.00ではawscliのバージョンを見てよきにはからってくれます。

awscli >= 0.15.0 のコマンド s3 と s3api

awscli < 0.15.0では"s3"コマンドしかなかったのですが、>= 0.15.0ではナント!"s3"が"s3api"に移動し、更にナント!ナント!! "s3"が全く別の高レベル操作のコマンドに変わりました。

AWS::CLIWrapper-1.00では、もしawscli >= 0.15.0でかつサブコマンドが低レベル操作(--list-bucketsとか--put-objectとか)のものだったら、内部的に "s3" の代わりに "s3api" を呼びます。これで古い時代に書かれたスクリプトも動きます。

返り値の型(互換対応あきらめ><)

awscliのバージョンによって、返される結果の構造が違います。

例えば elb describe-load-balancers の場合、awscli 0.9.3 だと

[
    {
        "DNSName": "xxx.elb.amazonaws.com",
        ...
    },
    ...
]

のようなリストが返るのですが、1.0.0だと

{
    "LoadBalancerDescriptions": [
        {
            "DNSName": "xxx.elb.amazonaws.com",
            ...
        },
        ...
    ],
    ...
}

のようにハッシュで返ってきます。

各コマンドの各サブコマンド×awscliのバージョンで網羅的に調べるのは大変なので、これはAWS::CLIWrapper側で対応するのはあきらめました。。。

かなりダサいですが、スクリプト側でこんな感じで互換対応してもらえればと思います。

for my $rs (@{ ref($res) eq 'ARRAY' ? $res : $res->{LoadBalancerDescriptions} }) {

ほかのawscliの非互換変更をみつけたら

是非、教えてください! できるだけAWS::CLIWrapper側で非互換を吸収する対応をしたいと思っています。