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側で非互換を吸収する対応をしたいと思っています。