Rust Runtime for AWS Lambdaの実行ファイルをWindows環境ビルドしたんだけど・・

# Rust Lambda のビルド

Rustを勉強するついでにあえてWLSを利用せずにWindows環境でRust実行環境の構築と
Lambda with Rustを構築してみたんだけども・・

## やりたいこと

AWS Lambdaで実行可能なbootstrapファイルをビルドできる環境を構築したい。

できれば、WSL環境が許されない現場でもどうにかしてビルドできる環境できないか
確認したい。


## 今回の動作環境

* Windows 10
* Rustインストール(rustup-init.exe)
* VSCode, rls extensionsインストール済み
* Windows 10 SDK, dev toolsをインストール済み
* Docker on Windowsインストール済み

##### 参考

[AWS Blog:Rust Runtime for AWS Lambda](https://aws.amazon.com/jp/blogs/opensource/rust-runtime-for-aws-lambda/)


#### Rustプロジェクトの作成

```powershell

PS C:\Users\h\OneDrive\ドキュメント\rust> cargo new rustlambdasample --bin
     Created binary (application) `rustlambdasample` package
PS C:\Users\h\OneDrive\ドキュメント\rust>  
```
#### x86_64-unknown-linux-muslターゲットを追加
```powershell
rustup target add x86_64-unknown-linux-musl
```

#### 必要なライブラリのインストール
VS 2019 Visual C++ optionをインストールしろとな。

```powershell

   Compiling futures v0.1.29
error: linker `link.exe` not found
  |
  = note: 指定されたファイルが見つかりません。 (os error 2)

note: the msvc targets depend on the msvc linker but `link.exe` was not found

note: please ensure that VS 2013, VS 2015, VS 2017 or VS 2019 was installed with the Visual C++ option

error: aborting due to previous error

error: could not compile `libc`.
warning: build failed, waiting for other jobs to finish...
error: build failed
```

windows上でのビルド環境がそろっていなかったのでbuildtoolとwindows 10 SDKをインストール。
[ビルド環境参考](https://github.com/rust-lang/rust#building-on-windows)
[Windows 10SDK](https://developer.microsoft.com/ja-jp/windows/downloads/windows-10-sdk)
[visualcppbuildtools_full.exeダウンロードぺージ](https://www.microsoft.com/ja-JP/download/details.aspx?id=48159)


x86_64-unknown-linux-muslの取り込み成功

#### crossのインストールとビルド

crossを利用すると簡単にクロスコンパイルできるらしいのでインストールしコンパイル実行する。


```powershell

cargo install cross
cross build --release --target x86_64-unknown-linux-musl

PS C:\Users\h\OneDrive\ドキュメント\rust\rustlambdasample> cross build --release --target x86_64-unknown-linux-musl       
Unable to find image 'rustembedded/cross:x86_64-unknown-linux-musl-0.1.16' locally
x86_64-unknown-linux-musl-0.1.16: Pulling from rustembedded/cross
35c102085707: Pull complete
251f5509d51d: Pull complete
8e829fe70a46: Pull complete
6001e1789921: Pull complete
1361eb413a0a: Pull complete
e23741e5f3bc: Pull complete
33fbfcc5c23e: Pull complete
924e4a072267: Pull complete
661205389135: Pull complete
e782bbff3ee6: Pull complete
cf883c10f870: Pull complete
Digest: sha256:e6a64723b28e7874b643a09a173a78f5e5d1841271b980632a9c479e200bba87
Status: Downloaded newer image for rustembedded/cross:x86_64-unknown-linux-musl-0.1.16
   Compiling libc v0.2.66
   Compiling cfg-if v0.1.10
   Compiling semver-parser v0.7.0
   Compiling autocfg v0.1.7
   Compiling futures v0.1.29
　　
~~~　中略　~~~

   Compiling tokio-uds v0.2.5
   Compiling tokio-udp v0.1.5
   Compiling tokio-tcp v0.1.3
   Compiling tokio-threadpool v0.1.17
   Compiling tokio-fs v0.1.6
   Compiling tokio v0.1.22
   Compiling lambda_runtime_client v0.1.0
   Compiling lambda_runtime v0.1.0
   Compiling rustlambdasample v0.1.0 (/project)
    Finished release [optimized] target(s) in 4m 30s
PS C:\Users\h\OneDrive\ドキュメント\rust\rustlambdasample> 
```



コンパイル成功！！

#### ユニットテストの実行
ユニットテストも実行してみる。
テスト書いてないけど。

~~~powershell
PS C:\Users\h\OneDrive\ドキュメント\rust\rustlambdasample> cross test --release --target x86_64-unknown-linux-musl        
   Compiling rustlambdasample v0.1.0 (/project)
    Finished release [optimized] target(s) in 8.31s
     Running /target/x86_64-unknown-linux-musl/release/deps/bootstrap-6074c8f123664827

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
~~~
実行は問題なくできている模様

#### デプロイしてみる

zip化してLambda環境にデプロイしてみる。
今回はコンソール画面からzipファイルでデプロイしていますよ。

```powershell

Compress-Archive -Path ./target/x86_64-unknown-linux-musl/release/bootstrap -DestinationPath rust.zip
```


#### Lambda関数設定値

- カスタム関数
- provided（ユーザー独自）

#### テストJSONリクエスト

```json
{
  "firstName": "Rustacean"
}
```

そして、実行！！


<img width="1032" alt="fail.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36221/1ff1e664-c3f7-629b-4270-94b21d3c3748.jpeg">


失敗・・・・。
実行権限がWindows上でのアーカイブだと設定できおらず、AWS Lambda内で実行できず失敗する模様。
方法わからなかったので分かる方いらっしゃったら教えてください・・・。


#### 仕方ないので・・・
ここまできたらどうにかビルドしたbootstrapの動作確認がしたいので・・。

（結局）WSLを介してzip化を行い再度デプロイしてみる。

```bash

# zip -j rust.zip ./target/x86_64-unknown-linux-musl/release/bootstrap
```


#### 再実行

成功！！

<img width="1044" alt="suc.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36221/a17c9dee-9c7f-c76d-9f20-c0fe32ab62bd.jpeg">

おとなしく公式のいうとおり、WSL上でビルドします・・・。

## まとめ

* windows 10なら迷わずwslを使いましょう。
* crossを利用すればクロスコンパイルの環境が簡単に用意できる。(ただしdocker環境が必要)
* windows 7などでもdocker on Windowsがインストールできてればローカル環境でAWS Lambdaの実行環境でユニットテストできそう。