Windows で AWS-CLI + node.js 実行環境を構築する

# <i class="fa fa-map-marker"></i> 目的
aws を cli で操作できる環境と、node.js でスクリプトを動かせる環境を構築しました。
その記録です。
![image](https://qiita-image-store.s3.amazonaws.com/0/130874/e61527f5-c12f-6bd3-8cbe-3797a1c7c000.png)


## 環境
Windows 10 / 64bit
※32bit でもインストーラーを読み替えて実施できます。

# <i class="fa fa-map-o"></i> 前提資料
こちらを見ながら進めました。

- AWS CLI のインストールと設定 - Amazon Kinesis Streams
    - http://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-tutorial-cli-installation.html
- Node.js 内の AWS SDK for JavaScript | AWS
    - https://aws.amazon.com/jp/sdk-for-node-js/


# <i class="fa fa-location-arrow"></i> 実施内容
##aws-cli導入
コマンドプロンプトから AWS を操作する aws-cli を導入します。
![image](https://qiita-image-store.s3.amazonaws.com/0/130874/a578a008-c8ef-28b1-67ed-bc08f9ddf030.png)
( 画像引用元：https://github.com/donnemartin/dev-setup )

####インストーラー取得
https://aws.amazon.com/jp/cli/
AWSCLI64.msi
※インストール手順は省略

###プロキシ設定
社内環境などでプロキシがある場合、コマンドプロンプト上で認証プロキシの設定を行います。

```cmd:console
set HTTP_PROXY=http://USERNAME:PASSWORD@proxyserver.example.com:8080
set HTTPS_PROXY=http://USERNAME:PASSWORD@proxyserver.example.com:8080
```

###IAM設定
AWS コンソールから、ユーザとグループの作成を行います。ここで取得したキーはソースに記載したり、git に上げたりしないよう注意しましょう。

####IAM > ユーザー > 新規ユーザの作成
任意のユーザを作成、「ユーザーごとにアクセスキーを生成」にチェックをし、ユーザのアクセスキー情報(CSV形式)を保存します。

####IAM > グループ > 新規グループの作成
任意のグループを作成、ロールに AdministratorAccess を割り当て、先ほど作成したユーザを追加します。

###aws-cli 初期設定
バージョン確認しておきます。

````cmd:console
>aws --version
aws-cli/1.10.36 Python/2.7.9 Windows/7 botocore/1.4.26
```

先ほどダウンロードした CSV を開き「Access Key Id」「Secret Access Key」列を確認して、aws-cli に認証キー設定を行います。

```cmd:console
>aws configure
AWS Access Key ID [none]:XXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [none]:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [none]:ap-northeast-1
Default output format [none]:json
```

※東京リージョンを選択しました
※output format は json, text, table があるようです
※複数 profile を使用したい場合は、--profile USERNAME2 オプションを毎回つけることでで別ユーザとして configure, コマンド実行 ができます

####設定確認
ユーザの .aws フォルダに認証情報が保存されているので、いちおう確認します。

```cmd:console

>dir C:\users\USERNAME\.aws\
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は A0D4-4C61 です

 C:\users\USERNAME\.aws のディレクトリ

2016/06/21  11:42    <DIR>          .
2016/06/21  11:42    <DIR>          ..
2016/08/12  16:31                51 config
2016/08/12  16:31               119 credentials

>type C:\users\USERNAME\.aws\config
[default]
region = ap-northeast-1
output = json

>type C:\users\USERNAME\.aws\credentials
[default]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

####コマンド実行
実際にコマンド実行してみて、認証キーが正しく設定されているか確認します、ためしに EC2 のセキュリティグループ一覧を表示してみます。先ほど設定したとおり json 形式で結果が取得できました。

```cmd:console
>aws ec2 describe-security-groups
{
    "SecurityGroups": [
        {
            (省略)
        }
    ]
}
```

##node.js導入
![image](https://qiita-image-store.s3.amazonaws.com/0/130874/e40bc702-e012-05a0-840e-a14894d89378.png)

https://nodejs.org/en/download/
node-v4.4.7-x64.msi
※インストール手順は省略

###バージョン確認
node、npm 両方入っていました。

```cmd:console
>npm -v
2.15.8

>node -v
v4.4.7
``` 

###aws-sdkインストール
AWS の [Getting Started with the SDK in Node.js](http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-intro.html) ページを見ると npm コマンドが書かれているので、そのとおり実施します。


```cmd:console
>npm install aws-sdk
aws-sdk@2.5.0 node_modules\aws-sdk
├── sax@1.1.5
├── xml2js@0.4.15
├── jmespath@0.15.0
└── xmlbuilder@2.6.2 (lodash@3.5.0)
```
※カレントディレクトリの「node_modules」フォルダに sdk がインストールされます。

###サンプル実行
今度は S3 の TESTBUCKET から一覧を取得するスクリプトを作成して、実行してみます。

```js:lists3sample.js
var AWS = require("aws-sdk");
AWS.config.region = 'ap-northeast-1'
var params = {
	Bucket:	'TESTBUCKET'
};
var s3 = new AWS.S3();
s3.listObjects(params, function(err, data) {
	if(err) console.log(err, err.stack);
	else 	console.log(data);
});
```

##Visual Studio Code も導入しました
もののついでに、メモ帳で json, node.js を書くのに限界を感じたので、Visual Studio Code をインストールしました[^1]。.NETer には使いやすいです。
https://www.visualstudio.com/ja-jp/products/code-vs.aspx
VSCodeSetup-stable.exe
※インストール手順は省略

###初期設定
また PROXY 設定をする必要がありました。VSCode の設定ファイルは男らしい json 形式になっているので、編集します。OS の環境変数に追記してもいいみたいです。

####ファイル > 基本設定 > ユーザ設定 より ウィンドウ右側を編集
```json:settings.json
// 既定の設定を上書きするには、このファイル内に設定を挿入します
{
        "http.proxy": "http://USERNAME:PASSWORD@proxyserver.example.com:8080"
}
```
※編集後、VSCode 再起動します

###拡張機能 導入
VSCode Market Place より、人気の拡張機能が確認できます。
https://marketplace.visualstudio.com/vscode/All%20categories?sortBy=Downloads
好きなものを入れればいいんですが、個人的にjavascript,json関連を入れたかったのでこちらを入れてみました。

- JavaScript (ES6) code snippets 
- Prettify JSON

####導入方法
上記リンクからではなく、Visual Studio Code を開いて拡張機能のマークから検索・インストールするのがお手軽です。
![image](https://qiita-image-store.s3.amazonaws.com/0/130874/75137f9e-5369-fbbb-0ab8-42ad8ec2beff.png)

####開いてみる
Visual Studio Code は拡張子から言語判定するので、.js や .json を開いてみて、なんかいい感じになっていることを確認します[^2]。
![image](https://qiita-image-store.s3.amazonaws.com/0/130874/892f9bbd-6ace-e8f2-cc4d-ddb2d9edfbfc.png)

（以上、おつかれさまでした）

# <i class="fa fa-pencil-square-o"></i> おまけのエラー集
###### Proxy 忘れたときのエラー
awc-cli のキー設定をしたあと、認証プロキシの設定をせずに実行したところエラーになりました。

```cmd:console
aws ec2 describe-security-groups
HTTPSConnectionPool(host='ec2.ap-northeast-1.amazonaws.com', port=443): Max retr
ies exceeded with url: / (Caused by ProxyError('Cannot connect to proxy.', error
('Tunnel connection failed: 403 Forbidden',)))
```

###### nodist導入失敗
Windows での node.js のバージョン管理には nodist を入れるのが一般的なようですが、私の環境では nodist update でエラーが起きたり、npm install aws-sdk が反応しなかったりしたので導入を諦めました。

```dos:console
>nodist -v
0.8.4

>nodist add 4.4.7

>nodist 4.4.7
4.4.7

>nodist ls
  (x64)
> 4.4.7  (global: 4.4.7)
  6.3.1

> nodist update
update
Installing undefined
C:\Program Files (x86)\Nodist\lib\nodist.js:89
  var major = parseInt(version.split('.')[0])
                              ^

TypeError: Cannot read property 'split' of undefined
    at Function.nodist.isIojs (C:\Program Files (x86)\Nodist\lib\nodist.js:89:31)
    at nodist.getSourceUrlPrefix (C:\Program Files (x86)\Nodist\lib\nodist.js:190:13)
    at nodist.getUrlToExe (C:\Program Files (x86)\Nodist\lib\nodist.js:206:18)
    at nodist.fetch (C:\Program Files (x86)\Nodist\lib\nodist.js:581:18)
    at C:\Program Files (x86)\Nodist\lib\nodist.js:491:10
    at C:\Program Files (x86)\Nodist\lib\nodist.js:416:7
    at _combinedTickCallback (internal/process/next_tick.js:67:7)
    at process._tickCallback (internal/process/next_tick.js:98:9)

> npm install aws-sdk
(反応なし、インストールされない)

>node lists3sample.js
module.js:327
    throw err;
    ^

Error: Cannot find module 'aws-sdk'
    at Function.Module._resolveFilename (module.js:325:15)
    at Function.Module._load (module.js:276:25)
    at Module.require (module.js:353:17)
    at require (internal/module.js:12:17)
    at Object.<anonymous> (D:\Dropbox\3-1-2_uploadobject.txt.js:1:73)
    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)
    at Function.Module.runMain (module.js:441:10)
```

# <i class="fa fa-external-link"></i> 参考リンク
（お世話になりました）

- 認証Proxy環境で、Windows AWS CLIを使う
    - http://d.hatena.ne.jp/showhey810/20140905/1409892787
- Windows ではじめてみる Node.js
    - http://www.cyokodog.net/blog/first-node-js/
- Windows10にnodist v0.8.0とNode.jsをインストール
    - http://okakacacao.wpblog.jp/technology/install-nodist080
- Visual Studio Codeの拡張機能を使ってみよう (1/2)
    - http://www.atmarkit.co.jp/ait/articles/1511/27/news029.html
- 統合開発環境はどれを使えば善いか？（独断と偏見の遥か彼方）
    - http://qiita.com/GeneralD/items/19affd5beba88517a708


[^1]: IntelliJ-IDEA でも Eclipse でも秀丸 notepad++ でも Vim でもお好みでどうぞ。
[^2]: 現時点ではエディタとして利用していてデバッグは使用していないので、後日記事を書くかもしれません。