Bash on Ubuntu on Windows で Serverless Framework インストールまで

# <i class="fa fa-map-marker" /> 目的
　毎日 AWS のことを考えていたら Windows のレジストリエディタが AWS のサービスに見えるくらいに頭がおかしくなってきました。
![AER.png](https://qiita-image-store.s3.amazonaws.com/0/130874/011a0d7c-4477-1a86-5ea6-b38113227db9.png)
（Elastic ってオイ）

　今回は [Serverless Framework](https://serverless.com/) を Windows 環境で使用したかったので、セットアップの手順です。MacBook ほしいよう。

# <i class="fa fa-plane" /> 結論
　Windows 10 の Bash on Ubuntu on Windows を使って、普通に Linux 環境での開発ができました。MacBook なんていらない！Serverless Framework の動作も確認できました。

# <i class="fa fa-map-o" /> 構成
 - Windows 10 64bit
 - Bash on Ubuntu on Windows
    - node.js v7.0.0
    - Serverless Framework v1.0.3

# <i class="fa fa-location-arrow" /> 手順

　[Installing The Serverless Framework](https://serverless.com/framework/docs/providers/aws/guide/installation/) を読みながら進めました。

## Bash on Ubuntu on Windows 導入
### インストール
　この手順は [適当なサイト](http://www.atmarkit.co.jp/ait/articles/1608/08/news039.html) を見れば良いと思います。

- Windows の機能 から Windows Subsystem for Linux (Beta) を有効にして再起動
- 設定->更新とセキュリティ->開発者向け->開発者向け機能を使う で 開発者モード を有効化

```bat:初回起動
C:\Windows\system32>bash
-- ベータ機能 --
これにより Windows に Ubuntu がインストールされます。Ubuntu は Canonical によって配布される製品であり、
次のサイトに示される条件に基づいてライセンスされています。
https://aka.ms/uowterms

続行するには、"y" を入力してください: y
Windows ストアからダウンロードしています... 100%
ファイル システムを展開しています。この処理には数分かかります...
既定の UNIX ユーザー アカウントを作成してください。ユーザー名は、Windows のユーザー名と一致する必要はありません。
詳細: https://aka.ms/wslusers を参照してください
新しい UNIX ユーザー名を入力してください: ADMIN
Enter new UNIX password:hoge
Retype new UNIX password:hoge
passwd: password updated successfully
インストールが正常に終了しました
環境が間もなく開始されます...
ドキュメントを参照できる場所: https://aka.ms/wsldocs
```

## Ubuntu on Windows 作業

<!-- いらないとおもう

### wget プロキシ設定
　認証プロキシ環境だったので、wget にプロキシ設定実施。

```bash:wgetできない
ADMIN@WINPC:/mnt/c/Windows/System32$ wget http://google.com
--2016-10-31 16:01:47--  http://google.com/
Resolving google.com (google.com)... 0x80004005failed: Name or service not known.
wget: unable to resolve host address ‘google.com’
ADMIN@WINPC:/mnt/c/Windows/System32$
```

```bash:設定ファイル修正
$ sudo vim /etc/wgetrc
```

```bash:/etc/wgetrc
# コメントはずして記載
http_proxy = http://USERNAME:PASSWORD@PROXYSERVER:8080
https_proxy = http://USERNAME:PASSWORD@PROXYSERVER:8080
```

```bash:wgetコマンド確認
$ wget http://google.com
--2016-10-31 16:41:04--  http://google.com/
Resolving PROXYSERVER (PROXYSERVER)... 160.240.128.92
Connecting to PROXYSERVER (PROXYSERVER)|160.240.128.92|:8080... connected.
Proxy request sent, awaiting response... 302 Moved Temporarily
Location: http://www.google.co.jp/?gfe_rd=cr&ei=xxx [following]
--2016-10-31 16:41:04--  http://www.google.co.jp/?gfe_rd=cr&ei=xxx
Connecting to PROXYSERVER (PROXYSERVER)|160.240.128.92|:8080... connected.
Proxy request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘index.html’

    [ <=>                                                                           ] 11,135      --.-K/s   in 0s

2016-10-31 16:41:04 (68.5 MB/s) - ‘index.html’ saved [11135]
```

## yum プロキシ設定

```bash:設定ファイル修正
$ sudo vim /etc/yum.conf
```

```/etc/yum.conf
# Proxy Setting
proxy=http://PROXYSERVER:8080
proxy_username=USERNAME
proxy_password=PASSWORD
```
-->

## プロキシ設定
　今回は認証プロキシ環境にいたので、環境変数を設定すします。apt-get は環境変数だけれど、wget や npm は別のところに定義したりするので注意が必要です。
　変数名は小文字、設定値に !（エクスクラメーション）がある場合はシングルクオート必須でした。
　以下、sudo 時には -E オプションを使用して環境変数を読ませます。

```bash:console
$ export http_proxy='http://USERNAME:PASSWORD@PROXYSERVER:8080/'
$ export https_proxy='http://USERNAME:PASSWORD@PROXYSERVER:8080/'
```

## apt-get update でパッケージを更新しておく

```bash:console
$ sudo -E apt-get update
Get:1 http://security.ubuntu.com trusty-security InRelease [65.9 kB]
Ign http://archive.ubuntu.com trusty InRelease
Get:2 http://archive.ubuntu.com trusty-updates InRelease [65.9 kB]
(略)
Fetched 3,382 kB in 40s (83.1 kB/s)
Reading package lists... Done
$ sudo -E apt-get update
```

## yum インストール

```bash:console
$ sudo -E apt-get install yum
Reading package lists... Done
Building dependency tree
(略)
Do you want to continue? [Y/n] y
Get:1 http://archive.ubuntu.com/ubuntu/ trusty/main liblua5.2-0 amd64 5.2.3-1 [80.5 kB]
Get:2 http://archive.ubuntu.com/ubuntu/ trusty-updates/main libnspr4 amd64 2:4.12-0ubuntu0.14.04.1 [110 kB]
(略)
```

## npm インストール

```bash:console
$ sudo -E apt-get install npm
Reading package lists... Done
Building dependency tree
(略)
Do you want to continue? [Y/n] y
Get:1 http://archive.ubuntu.com/ubuntu/ trusty-updates/main libssl1.0.0 amd64 1.0.1f-1ubuntu2.21 [830 kB]
Get:2 http://archive.ubuntu.com/ubuntu/ trusty-updates/main libasan0 amd64 4.8.4-2ubuntu1~14.04.3 [63.1 kB]
(略)
```

## npm プロキシ設定
　環境変数だけだといけなかったので、npm にも認証プロキシを設定しました。

```bash:console
$ sudo npm -g config set proxy 'http://USERNAME:PASSWORD@PROXYSERVER:8080/'
$ sudo npm -g config set http-proxy 'http://USERNAME:PASSWORD@PROXYSERVER:8080/'
```

## node.js, n インストール

```bash:console
$ sudo yum install nodejs --enablerepo=epel
$ sudo npm install -g n
npm http GET https://registry.npmjs.org/n
npm http 200 https://registry.npmjs.org/n
npm http GET https://registry.npmjs.org/n/-/n-2.1.4.tgz
npm http 200 https://registry.npmjs.org/n/-/n-2.1.4.tgz
/usr/local/bin/n -> /usr/local/lib/node_modules/n/bin/n
n@2.1.4 /usr/local/lib/node_modules/n
$ nodejs -v
v0.10.25
```

## n で nodejs の stable バージョンをインストール

```bash:console
$ sudo -E n stable

     install : node-v7.0.0
       mkdir : /usr/local/n/versions/node/7.0.0
       fetch : https://nodejs.org/dist/v7.0.0/node-v7.0.0-linux-x64.tar.gz
######################################################################## 100.0%
   installed : v7.0.0

```

*※ Serverless Framework のサポートしている node.js バージョンを指定すること、いまは Node v4 or higher*

## Serverless Framework インストール
　いけました。

```bash:console
$ sudo -E npm install serverless -g
/usr/local/bin/serverless -> /usr/local/lib/node_modules/serverless/bin/serverless
/usr/local/bin/slss -> /usr/local/lib/node_modules/serverless/bin/serverless
/usr/local/bin/sls -> /usr/local/lib/node_modules/serverless/bin/serverless
/usr/local/lib
└─┬ serverless@1.0.3
  ├── agent-base@2.0.1
(略)
  └── zip-stream@1.1.0
$ serverless -v
1.0.3
```

## aws-cli インストール
　必要でした。

```bash:console
$ sudo -E npm install serverless -g

```

# <i class="fa fa-cube" /> Serverless Framework を使ってみる

## 設定
```bash:console
sls config credentials --provider aws --key XXXXXXXXXXXX --secret XxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxXxX
Serverless: Setting up AWS...
Serverless: Saving your AWS profile in "~/.aws/credentials"...
Serverless: Success! Your AWS access keys were stored under the "default" profile.
```

## テンプレートから作成

```bash:console
$ sls create --template aws-nodejs
Serverless: Creating new Serverless service…
 _______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v1.0.3
 -------'

Serverless: Successfully created service with template: "aws-nodejs"
Serverless: NOTE: Please update the "service" property in serverless.yml with your service name
```

- hander.py
    - hello ファンクションがありました
- serverless.yml
    - 設定ファイルです

## 設定変更
　リージョンだけ変えておきます。

```yaml:serverless.yml
# you can overwrite defaults here
# stage: dev
region: ap-northeast-1
```

## デプロイ
```bash:console
$ sls deploy
Serverless: Creating Stack...
Serverless: Checking Stack create progress...
.....
Serverless: Stack create finished...
Serverless: Packaging service...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading service .zip file to S3 (639 B)...
（略）
hoge-dev-hello
```

# <i class="fa fa-pencil-square-o" /> 感想
　デプロイ楽ちん。いままで AWS コンソールでやっていたのがアホらしくなった。
　なお、Visual Studio Code の標準コンソールを bash にすると非常によかったのでその旨記載しています。VSCode は、いいぞ。

[Visual Studio Code のおすすめ拡張機能と設定値(2016/11 版 随時更新) - Qiita
![image](https://qiita-image-store.s3.amazonaws.com/0/130874/e19389ca-b214-8130-4eb1-5ed94708db6d.png)
](http://qiita.com/saitotak/items/3ea2a1897dca6bb5b91b)



# <i class="fa fa-external-link" /> 参考リンク
(お世話になりました)
[Tech TIPS：Windows 10のLinux／Ubuntu互換環境でbashを使う - ＠IT](http://www.atmarkit.co.jp/ait/articles/1608/08/news039.html)
[Bash on Ubuntu on Windowsとは？ そのインストールと使い方 - Build Insider](http://www.buildinsider.net/enterprise/bashonwindows/01)
[更新とセキュリティの開発者向けパッケージがエラーでインストールできない - マイクロソフト コミュニティ](http://answers.microsoft.com/ja-jp/insider/forum/insider_wintp-insider_update/%E6%9B%B4%E6%96%B0%E3%81%A8%E3%82%BB%E3%82%AD/09d72782-4728-4ea6-934c-d4d235f9b738)
[Linux,Windowsのプロキシ設定あれこれ - Qiita](http://qiita.com/chroju/items/752eaba0fc0e1b11c524)
[[Node.js] npm の proxy と registry 設定 - Qiita](http://qiita.com/LightSpeedC/items/b273735e909bd381bcf1)
[Serverless Framework入門(v0.5.x対応) - Qiita](http://qiita.com/mpppk/items/40badc30008a86928406)
[AWS Lambdaを活用したServerless Frameworkを触ってみる - Qiita](http://qiita.com/susieyy/items/1c2af0ef7b88b742c37a)

(以上)