Top / AWS / AWS CLI

AWS CLIとは、AWSのCommand Line Interface つまりターミナルからAWSを操作するためのツール群です。

$ aws s3 ls s3://nu.mine.kino.hogebucket
2016-11-10 12:46:26        700 hoge2.py

とかやってS3をターミナルから操作することが出来ます。便利です。。

インストール

あちなみにMacでやっててOSは El Capitanです

$ sw_vers 
ProductName:	Mac OS X
ProductVersion:	10.11.6
BuildVersion:	15G1108
$ sudo easy_install pip
$ sudo pip install awscli --upgrade --ignore-installed six
$ sudo pip install boto3 --upgrade --ignore-installed six
$ sudo aws --v
$ which aws

どうもこのignoreオプションをつけないとエラーが出たっぽい、、。

環境設定

クライアントにcredential情報を設定するためのコマンドを実行します。 AWS Access Key ID、AWS Secret Access Keyはマネジメントコンソールであらかじめ設定済みと仮定します。

参考 Amazon S3 再入門 – AWS IAMでアクセスしてみよう!

$ aws configure
AWS Access Key ID [****************]: xxxxxxxxxxxxxx   ←あらかじめマネジメントコンソールで設定済みの値。
AWS Secret Access Key [****************]: yyyyyyyyyy   ←あらかじめマネジメントコンソールで設定済みの値。
Default region name [None]: ap-northeast-1  ← 東京
Default output format [None]: json
$
$ ls -lrt ~/.aws/
-rw-r--r--  1 masatomix  staff  118 11 10 12:41 credentials
-rw-------  1 masatomix  staff   48 11 10 12:41 config
$ cat  ~/.aws/config 
[default]
output = json
region = ap-northeast-1
$ cat  ~/.aws/credentials 
[default]
aws_access_key_id = xxxxxxxxxxxxxx
aws_secret_access_key =  yyyyyyyyyy

インストール完了です。コマンドラインからAWSが操作できるようになりました。

つかってみる。

$ aws s3 ls  ← Bucketの一覧表示
2016-11-08 18:59:46 nu.mine.kino.hogebucket

$ aws s3 ls s3://nu.mine.kino.hogebucket  --recursive ← 指定したBucketの中身を表示

$ ls -lrt dir1
total 8
-rw-r--r--  1 masatomix  staff  13 11 12 10:31 file1.txt
$ aws s3 sync dir1 s3://nu.mine.kino.hogebucket/dir2
upload: dir1/file1.txt to s3://nu.mine.kino.hogebucket/dir2/file1.txt  ローカルのdir1ディレクトリと、Bucketのdir2ディレクトリを同期。
$ aws s3 ls s3://nu.mine.kino.hogebucket/ --recursive
2016-11-12 10:33:26         13 dir2/file1.txt

EC2にもつなげる

$ aws ec2 describe-instances

などで、EC2のインスタンス情報がJSON取得できます。jqなどで整形した情報をだしてみるとこんなかんじ。

$ aws ec2 describe-instances | jq \
 '.Reservations[].Instances[] | .PublicDnsName, .State, .PublicIpAddress, .PrivateIpAddress,.PrivateDnsName'
"ec2-xx-xxx-xxx-xx.ap-northeast-1.compute.amazonaws.com"
{
  "Code": 16,
  "Name": "running"
}
"xx.xxx.xxx.xx"
"yyy.yy.yy.yy"
"ip-yyy-yy-yy-yy.ap-northeast-1.compute.internal"
$ aws ec2 describe-instances | jq \
 '.Reservations[].Instances[] | .PublicDnsName, .State, .PublicIpAddress, .PrivateIpAddress,.PrivateDnsName'

の他に、

$ aws ec2 describe-instances | jq \
 '.Reservations[].Instances[] | [.PublicDnsName, .State, .PublicIpAddress, .PrivateIpAddress, .PrivateDnsName]'

ってJSON配列で返したり、

$ aws ec2 describe-instances | jq \
 '.Reservations[].Instances[] | {PublicDnsName, State, PublicIpAddress, PrivateIpAddress, PrivateDnsName}'

って新たなJSONで返すなんて事も可能。

Node.jsから使う。

$ mkdir asw-sdk-node && cd $_
$ npm init
$ npm install --save aws-sdk
$ npm install

SDKのインストールとかが完了しました。

$ cat index.js
"use strict";

var AWS = require('aws-sdk');
AWS.config.update({region: 'ap-northeast-1'});

var ec2 = new AWS.EC2();
ec2.describeInstances( function(err, data) {
  if (err) {
    console.log(err, err.stack);
  } else {
    for (var index = 0; index <  data.Reservations.length; index++){
      // var instances = data.Reservations[index].Instances;
      data.Reservations[index].Instances.forEach(
        function(instance){
          console.log("PublicDnsName: " + instance.PublicDnsName);
          console.log("State: " + JSON.stringify(instance.State));
          console.log("PublicIpAddress: " + instance.PublicIpAddress);
          console.log("PrivateIpAddress: " + instance.PrivateIpAddress);
          console.log("PrivateDnsName: " + instance.PrivateDnsName);
        }
      );
    }
  }
});

と書いてみます。

$ node index.js

で先のコマンドラインからとおなじ情報が得られます。

ちなみに、AWS_ACCESS_KEY_ID とか AWS_SECRET_ACCESS_KEY などのCredential情報を取得するにはいろいろ方法があります。環境変数からや、自前のJSONファイルから、もしくはCredentialファイル直接*1 などです。これらの方法は下記にまとまっていました。

CoffeeScript?から使う

Node.jsとほぼ同じなんですがHubotから使おうとして書いたコード。

$ cat hubot-sample.coffee
AWS = require('aws-sdk');

module.exports = (robot) ->
  robot.respond /(サーバ情報)/i, (res) ->

    AWS.config.update {region: 'ap-northeast-1'}
    ec2 = new AWS.EC2()

#    ec2 = new AWS.EC2(
#      {
#        accessKeyId: 'xxx',
#        secretAccessKey: 'xxx',
#        region: 'ap-northeast-1'
#      }
#    );

    ec2.describeInstances (err,data) ->
      if err
        console.log err, err.stack
      else
        for reservation in data.Reservations
          for instance in reservation.Instances
            console.log "PublicDnsName: " + instance.PublicDnsName
            console.log "State: " + JSON.stringify(instance.State)
            console.log "PublicIpAddress: " + instance.PublicIpAddress
            console.log "PrivateIpAddress: " + instance.PrivateIpAddress
            console.log "PrivateDnsName: " + instance.PrivateDnsName

            message = ""
            message += "PublicDnsName: " + instance.PublicDnsName + '\n'
            message += "State: " + instance.State.Name + '\n'
            message += "PublicIpAddress: " + instance.PublicIpAddress + '\n'
            message += "PrivateIpAddress: " + instance.PrivateIpAddress + '\n'
            message += "PrivateDnsName: " + instance.PrivateDnsName + '\n'
            res.send message

関連リンク


この記事は

選択肢 投票
おもしろかった 0  
そうでもない 0  

Top / AWS / AWS CLI

現在のアクセス:2610


*1 ~/.aws/credentials のこと

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS