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 などです。これらの方法は下記にまとまっていました。

具体的には、こんな感じ。

// 自分で環境変数を設定
// $ export AWS_ACCESS_KEY_ID=xxxx
// $ export AWS_SECRET_ACCESS_KEY=xxx
// $ export AWS_DEFAULT_REGION=ap-northeast-1
// $ export AWS_DEFAULT_OUTPUT=json
// const ec2 = new AWS.EC2({region: 'ap-northeast-1'});
// // AWSのCredentialsファイルから情報取得
// const credentials = new AWS.SharedIniFileCredentials({profile: 'default'});
// AWS.config.credentials = credentials;
// const ec2 = new AWS.EC2({region: 'ap-northeast-1'});
// // 設定ファイルから情報取得
// AWS.config.loadFromPath('./config/config.json');
// // $cat config/config.json
// // { "accessKeyId": <YOUR_ACCESS_KEY_ID>,
// //   "secretAccessKey": <YOUR_SECRET_ACCESS_KEY>,
// //   "region": "ap-northeast-1"
// // }
// const ec2 = new AWS.EC2();
// // もしくは直接指定
// const ec2 = new AWS.EC2(
//   {
//     accessKeyId: 'xxx',
//     secretAccessKey: 'xxxx',
//     region: 'ap-northeast-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.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  
  • Raspberry Piでやる場合はpipをpip3と読み替えればPython3系にインストールされるようです -- きの? 2016-11-12 (土) 17:12:07

Top / AWS / AWS CLI

現在のアクセス:385


*1 ~/.aws/credentials のこと

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-09-27 (水) 16:12:04 (52d)