AWS Command Line Interface(awscli)を使ってみた

by zzpza



今更な話題ではありますが、Pythonで作られたAWS Command Line Interface(aws-cli: 従来のJavaで動いていたEC2 API Toolsとは別物)を入れて動かしてみました。メモ的な感じで残しておきます。

aws-cliは、pipで管理できるし、これ1つで複数のAWSサービスを扱うことが出来て、かつレスポンスもJSONとかで返ってくるので、なかなか便利です。

$ aws 
autoscaling        ec2                importexport       sns
cloudformation     elasticache        opsworks           sqs
cloudsearch        elasticbeanstalk   rds                storagegateway
cloudwatch         elastictranscoder  redshift           sts
datapipeline       elb                route53            support
directconnect      emr                s3                 swf
dynamodb           iam                ses                

サブコマンド一覧は↑のような感じで、メインどころのAWSサービスはサポートされています。(公式ツールなので、今後も拡充されていくと思います。)


尚、今から説明することは、大体は以下のAWS公式のドキュメントに記載されていまので、こちらを読んでもらってもいいかと思います。(英語)

インストール

僕は、手元のUbuntuさんにインストールしてみました。

$ pip
プログラム 'pip' はまだインストールされていません。 次のように入力することでインストールできます:
sudo apt-get install python-pip

pipコマンドを打って、↑のような感じで出力されたら、まだpip自体が入っていないので、、、

$ sudo apt-get install python-pip

書かれている通りに従って、"python-pip"をインストールしてください。その後、

$ sudo pip install awscli

上記のような感じで、今回お目当ての"awscli"をインストールします。

設定

Access Credentials (Access Key) を、以下のURLとかで確認した上で、

[default]
aws_access_key_id=(Access Key ID)
aws_secret_access_key=(Secret Access Key)
region=ap-northeast-1

こんな感じで、1ファイルに記載して、

$ export AWS_CONFIG_FILE=~/config/awscli.conf

↑みたいな感じで、"AWS_CONFIG_FILE"の環境変数に食わせてやればOKです。

実行してみる

上記の設定まで終わると、あとは普通に実行できると思います。例えば以下のコマンド。

$ aws ec2 describe-regions 
{
    "Regions": [
        {
            "Endpoint": "ec2.eu-west-1.amazonaws.com", 
            "RegionName": "eu-west-1"
        }, 
        {
            "Endpoint": "ec2.sa-east-1.amazonaws.com", 
            "RegionName": "sa-east-1"
        }, 
        {
            "Endpoint": "ec2.us-east-1.amazonaws.com", 
            "RegionName": "us-east-1"
        }, 
        {
            "Endpoint": "ec2.ap-northeast-1.amazonaws.com", 
            "RegionName": "ap-northeast-1"
        }, 
        {
            "Endpoint": "ec2.us-west-2.amazonaws.com", 
            "RegionName": "us-west-2"
        }, 
        {
            "Endpoint": "ec2.us-west-1.amazonaws.com", 
            "RegionName": "us-west-1"
        }, 
        {
            "Endpoint": "ec2.ap-southeast-1.amazonaws.com", 
            "RegionName": "ap-southeast-1"
        }, 
        {
            "Endpoint": "ec2.ap-southeast-2.amazonaws.com", 
            "RegionName": "ap-southeast-2"
        }
    ]
}

こんな感じ。

コマンドの入力補完

とりあえず、このコマンドの入力補完機能は有効にしておきましょう。便利。

$ complete -C aws_completer aws

↑のコマンド(bash用)を実行すると、入力時にタブを押すことで補完が効いたり、コマンド候補が出るようになります。
便利なので必要に応じて、".bash_profile"とかにも書いておいて、最初に読み込まれるようにしておきましょう。


ちなみに、

tcsh

$ complete aws 'p/*/`aws_completer`/'

zsh

$ source aws_zsh_completer.sh

出力フォーマットの変更

ちなみにhelpを読むと、出力フォーマットは、以下3種類から選べるようです。

  • json
  • text
  • table


デフォルトだとJSONで返ってきますね。(さっき↑で実行したもの)
出力フォーマットの変更は、"--output"オプションを使うみたいです。

text

$ aws ec2 describe-regions --output text

ec2.eu-west-1.amazonaws.com	eu-west-1
ec2.sa-east-1.amazonaws.com	sa-east-1
ec2.us-east-1.amazonaws.com	us-east-1
ec2.ap-northeast-1.amazonaws.com	ap-northeast-1
ec2.us-west-2.amazonaws.com	us-west-2
ec2.us-west-1.amazonaws.com	us-west-1
ec2.ap-southeast-1.amazonaws.com	ap-southeast-1
ec2.ap-southeast-2.amazonaws.com	ap-southeast-2

従来のEC2 API Toolsっぽい感じですw

table

$ aws ec2 describe-regions --output table
----------------------------------------------------------
|                     DescribeRegions                    |
+--------------------------------------------------------+
||                        Regions                       ||
|+-----------------------------------+------------------+|
||             Endpoint              |   RegionName     ||
|+-----------------------------------+------------------+|
||  ec2.eu-west-1.amazonaws.com      |  eu-west-1       ||
||  ec2.sa-east-1.amazonaws.com      |  sa-east-1       ||
||  ec2.us-east-1.amazonaws.com      |  us-east-1       ||
||  ec2.ap-northeast-1.amazonaws.com |  ap-northeast-1  ||
||  ec2.us-west-2.amazonaws.com      |  us-west-2       ||
||  ec2.us-west-1.amazonaws.com      |  us-west-1       ||
||  ec2.ap-southeast-1.amazonaws.com |  ap-southeast-1  ||
||  ec2.ap-southeast-2.amazonaws.com |  ap-southeast-2  ||
|+-----------------------------------+------------------+|

リージョン(Region)の変更

ドキュメントを読む限り、以下の3パターンがあるみたいです。

  • AWS_CONFIG_FILE環境変数で指定した設定ファイルの"region"に記載(↑の設定で書いたやり方)
  • AWS_DEFAULT_REGION環境変数に指定
  • awsコマンドで"--region"オプションの指定(↓みたいな感じ)
$ aws ec2 describe-availability-zones --region us-west-1
{
    "AvailabilityZones": [
        {
            "State": "available", 
            "RegionName": "us-west-1", 
            "Messages": [], 
            "ZoneName": "us-west-1a"
        }, 
        {
            "State": "available", 
            "RegionName": "us-west-1", 
            "Messages": [], 
            "ZoneName": "us-west-1b"
        }, 
        {
            "State": "available", 
            "RegionName": "us-west-1", 
            "Messages": [], 
            "ZoneName": "us-west-1c"
        }
    ]
}

プロファイルの使用

設定ファイルにプロファイルを定義しておくと、コマンドの実行時や環境変数で切り替えることができるみたいです。

[default]
aws_access_key_id=(Access Key ID)
aws_secret_access_key=(Secret Access Key)
region=ap-northeast-1

[development]
aws_access_key_id=xxxxxxxxxx
aws_secret_access_key=xxxxxxxxxxxxxxxxxxx
region=ap-northeast-1

[staging]
aws_access_key_id=yyyyyyyyyy
aws_secret_access_key=yyyyyyyyyyyyyyyyyyyy
region=us-west-1

[production]
aws_access_key_id=zzzzzzzzzz
aws_secret_access_key=zzzzzzzzzzzzzzzzzzzz
region=us-east-1


使い方というか指定方法は、、、

  • AWS_DEFAULT_PROFILE環境変数に設定
  • "--profile"オプションで定義したプロファイル名を指定する

とかで制御できるみたいっす。

返ってきたJSONを整形したり、必要なものだけ抽出したり

公式ドキュメントにも書かれていますが、"jq"を使うと必要なものだけ抽出できたり、ハイライト表示してくれたりで、なかなかいい感じです。


例えば、"aws ec2 describe-regions"のRegionNameに対するValueだけとる場合は、以下のような感じです。

$ aws ec2 describe-regions | jq '.Regions[].RegionName'
"eu-west-1"
"sa-east-1"
"us-east-1"
"ap-northeast-1"
"us-west-2"
"us-west-1"
"ap-southeast-1"
"ap-southeast-2"


現在、東京リージョンで稼働中(available)のZoneの一覧とか。

$ aws ec2 describe-availability-zones --region ap-northeast-1 | jq '.AvailabilityZones[] | select(.State == "available") | .ZoneName'
"ap-northeast-1a"
"ap-northeast-1b"
"ap-northeast-1c"


と、こんな感じで色々欲しい値を引っこ抜けます。"jq"の詳しい使い方は、以下のマニュアルまで。

最後に、困ったときは

ヘルプを読みましょー。

$ aws help

とか。以下のようにサブコマンドごとにも用意されています。

$ aws ec2 help

とかとか。

$ aws ec2 describe-regions help

とかとかとか。

それでは! =͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́

参考リンク




まとめ


クラウドAMAZON EC2/S3のすべて (ITpro BOOKs)

クラウドAMAZON EC2/S3のすべて (ITpro BOOKs)