注目の記事

Windows10+WSL2環境で快適AWSサーバレス開発

Windows 10 バージョン2004 ビルド19041(通称、May 2020 Update)では、WSL(Windows Subsystems for Linux)がバージョンアップしました。WSL2+Docker Desktop for WindowsでAWSサーバレス開発環境を改善してみようと思います。
2020.07.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

データアナリティクス事業本部の藤川です。2020年5月下旬に、Windows 10 バージョン2004 ビルド19041(通称、May 2020 Update)が正式にリリースされました。Windows版Dockerユーザにとっては待望のWindows Updateになりました。

最近、Macで開発する方が増えていると思います。クラウド/WebサービスはLinuxで運用するケースが多く、UNIX由来のOSであるLinuxやmacOSとの親和性が高いこともあり、これらOSが開発環境として採用されるのでしょう。WebデザイナーがUIを開発し、リリースする場合、すべてのワークフローがMacで完結するでしょう。

一方、Windowsが敬遠されるケースは、Dockerを採用する場合に特に顕著です。あらゆる環境を瞬時に用意できるDockerは、コンテナ環境のOS依存性を吸収してくれますが、ホストOSをWindowsとした場合、次のようなWindowsの方言が足かせとなり、開発効率が著しく低下してしまうケースが散見されます。

  • 開発者を悩ませるWindows版Dockerの課題
    • ファイルシステムの違い
      • パス表記(ドライブレター(C:)パス区切り文字(\、/))が異なる
    • シェルの違い
      • 環境変数の表記方法(%PATH%、$PATH)が異なる
      • コマンドプロンプトPowerShell等複数あるが、互換性がない
    • DockerサービスがVMで提供されている
      • Dockerサービスの起動が遅い
      • 無駄なリソース(特に、ディスク領域、メモリ)が必要
      • Hyper-Vが必要(Windows 10 Home Edition以外)
      • VirtualBoxが必要(Windows 10 Home Edition)

そこで、May 2020 Updateの目玉である次の2機能を活用し、快適なAWS SAM CLI開発環境を構築してみようというのが本記事の主旨です。

  • May 2020 Updateの注目機能
    • Docker Desktop for Windows
    • Windows Subsystem for Linux(WSL) 2

前提環境

  • Windows 10 バージョン2004 ビルド19041(May 2020 Update)以降
  • Windows Subsystem for Linux(Linux用Windowsサブシステム)をインストール済み
  • 仮想マシン プラットフォームをインストール済み
  • WSL2 Linuxカーネル更新プログラムをインストール済み
  • IAMユーザ及びIAMユーザのアクセスキーが発行済み
  • WSL用のLinuxディストリビューション(本記事ではUbuntu 20.04 LTS)を使用
  • Windows用gitコマンド ※Docker Desktop for Windowsインストールのために必要

前述の環境が揃っていない場合は、Windows10+WSL2環境のLinuxディストリビューションにAWS CLIをインストールしてみたで作業を済ませておいてください。

また、統合開発環境として、Microsoft Visual Studio Code(通称、VSCode)をインストールすると、より便利です。

ゴール

本記事では、Windows 10 Home Editionを使用し、WSL2用のUbuntu 20.04 LTSにインストールしたAWS CLI/AWS SAM CLIをVSCodeに統合し、開発できるようにします。

インストール手順

Docker Desktop for Windowsをインストール

DockerHubDocker Desktop for Windowsページからインストーラをダウンロードします。インストーラを実行すると、Docker Desktop for Windows本体をダウンロードし、インストールしてくれます。

1.Docker Desktop for Windowsを開きます。
2.Get Stableボタン(もしくは、Get Edgeボタン)をクリックし、Docker Desktop Installer.exeファイルをダウンロードします。
3.Docker Desktop Installer.exeファイルをダブルクリックし、実行します。
4.Docker Desktopのダウンロードが始まります。 ddfw1 5.特にチェックを変更せずに、そのままOKボタンをクリックします。
ddfw2 6.インストール(解凍)が始まります。
ddfw3 7.インストール(解凍)が完了したら、Close and log outボタンをクリックしてください。
ddfw4

Dockerダッシュボードを設定

Docker Desktop for Windowsのインストールが終了すると、Windowsをログオフし、再度ログオンが必要でした。Windowsにログオンすると、Dockerダッシュボードが自動的に起動します。

1.DockerダッシュボードStartボタンをクリックします。
ddfw21 2.右側にPowerShellが開きます。git clone https://github.com/docker/getting-started.gitボタンをクリックすると、PowerShellで試せるようです。Next Stepボタンをクリックします。
ddfw22 3.中央の青いボタンをクリックすると、docker101tutorialという名称のDockerイメージを作成できます。Next Stepボタンをクリックします。
ddfw23 4.中央の青いボタンをクリックすると、Dockerイメージ(docker101tutorial)からdocker-tutorialという名称のDockerコンテナが起動します。Next Stepボタンをクリックします。
ddfw24 5.DockerHubのアカウントをお持ちであれば、Dockerイメージpushできます。ここでは、Doneボタンをクリックします。
ddfw25 6.Go directlly to the Dashboard insteadリンクをクリックします。
ddfw27

Docker Desktop WSL 2 backendを設定

Ubuntu上でdockerコマンドを利用できるようにします。

1.スタートメニュー-Docker Desktopをクリックし、Dockerダッシュボードを開きます。
2.画面右上にある歯車アイコンをクリックし、設定画面を開きます。
ddfw28 3.Resources-WSL INTEGRATIONを開きます。
4.Ubuntu-20.04のインジケーターをクリックし、アクティブ化(青色)します。
5.画面右下にあるApply & Restartボタンをクリックします。
ddfw31 6.Dockerサービスが再起動します。
7.スタートメニュー-Ubuntu 20.04 LTSをクリックします。
8.Ubuntuで次のコマンドを実行し、エラーがなければ完了です。

$ docker --version
Docker version 19.03.8, build afacb8b7f0

Ubuntuを起動

VSCodeを使用しない場合

1.スタートメニュー-Ubuntu 20.04 LTSをクリックしてUbuntuを起動します。

WSL2をVSCodeに統合する場合

1.VSCodeを起動し、拡張機能を開きます。
2.Remote - WSL」(ms-vscode-remote.remote-wsl)をインストールします。
3.VSCodeでリモートエクスプローラーを開きます。
4.プルダウンでWSL Targetsを選択します。
5.一覧にUbuntu 20.04 LTSが表示されるので、右クリックして、Connect to WSLをクリックします。
vscode-connect2wsl 6.VSCodeのターミナルUbuntu 20.04 LTSのプロンプトが表示されます。
vscode-wsl-targets

AWS SAM CLIをインストール

AWS SAM CLIWSL2上のUbuntuにインストールします。 LinuxへのAWS SAM CLIのインストールに従い、作業を進めます。

1.先ほど開いたUbuntuで作業します。依存パッケージをインストールします。

$ sudo apt install gcc

2.Dockerはインストール済みなので、「ステップ 4:Homebrew のインストール」から実行します。

$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"

3.HomebrewにPATHを通します。ここでは、Ubuntuを使用しているのですが、~/.profileに追記されます。

$ test -d ~/.linuxbrew && eval $(~/.linuxbrew/bin/brew shellenv)
$ test -d /home/linuxbrew/.linuxbrew && eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)
$ test -r ~/.bash_profile && echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.bash_profile
$ echo "eval \$($(brew --prefix)/bin/brew shellenv)" >>~/.profile

4.Homebrewがインストールされたことを確認します。

$ brew --version

5.AWS SAM CLIをインストールします。

$ brew tap aws/tap
$ brew install aws-sam-cli

6.AWS SAM CLIがインストールされたことを確認します。

$ sam --version
SAM CLI, version 0.52.0

サンプルアプリケーションを使用

サンプルアプリケーションをデプロイします。 チュートリアル:Hello Worldアプリケーションのデプロイに従い、作業します。

プロジェクトフォルダを作成

1.AWS SAMのプロジェクトフォルダを新規作成します。

$ sam init --name sam-app --runtime python3.8 --dependency-manager pip --app-template hello-world

2.次のようなプロファイルでプロジェクトフォルダが作成されました。

-----------------------
Generating application:
-----------------------
Name: sam-app
Runtime: python3.8
Dependency Manager: pip
Application Template: hello-world
Output Directory: .

サンプルアプリケーションを起動

1.sam local invokeコマンドを実行すると、Dockerイメージ(ここでは、lambci/lambda:python3.8にサンプルアプリケーションがデプロイされて、起動します。

$ cd sam-app
$ sam local invoke
Invoking app.lambda_handler (python3.8)

Fetching lambci/lambda:python3.8 Docker container image...

(中略)

Mounting /home/sshuser/work/sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated inside runtime container
START RequestId: cffffc90-58da-1c62-2db6-223559b1e5c7 Version: $LATEST
END RequestId: cffffc90-58da-1c62-2db6-223559b1e5c7
REPORT RequestId: cffffc90-58da-1c62-2db6-223559b1e5c7  Init Duration: 1218.41 ms       Duration: 12.41 ms      Billed Duration: 100 ms Memory Size: 128 MB     Max Memory Used: 30 MB

{"statusCode":200,"body":"{\"message\": \"hello world\"}"} ← アプリケーションの実行結果

AWSにデプロイ

ここからはオマケみたいなものです。ローカルのDocker環境で動作確認した上で、AWS SAM CLIでAWSにデプロイできます。

1.AWSにデプロイする場合は次のコマンドを実行してください。

$ sam deploy --guided --stack-name sam-app --region ap-northeast-1 --profile hogehoge

2.画面出力されるテキストの末尾を控えておいてください。

CloudFormation outputs from deployed stack
-------------------------------------------------------------------------------------------------
Outputs                                                                                         
-------------------------------------------------------------------------------------------------
Key                 HelloWorldFunctionIamRole                                                   
Description         Implicit IAM Role created for Hello World function                          
Value               arn:aws:iam::xxxxxxxxxxxxxx:role/sam-app-HelloWorldFunctionRole-Y4PCCVYF8LZ7  

Key                 HelloWorldApi                                                               
Description         API Gateway endpoint URL for Prod stage for Hello World function            
Value               https://128swv9rci.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/     

Key                 HelloWorldFunction                                                          
Description         Hello World Lambda Function ARN                                             
Value               arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxxxx:function:sam-app-                
HelloWorldFunction-1ESHSYIG5PQIG                                                                
-------------------------------------------------------------------------------------------------

Successfully created/updated stack - sam-app in ap-northeast-1

動作確認

1.先ほど控えておいたテキストの中ほどにAPI GatewayのエンドポイントURLが記載されています。このURLにcurlコマンドでアクセスします。

$ curl https://128swv9rci.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/

2.分からなくなった場合は次のコマンドで取得できます。

$ aws apigateway get-rest-apis --query "items[?name=='sam-app']" --profile hogehoge
[
    {
        "id": "128swv9rci",
        "name": "sam-app",
        "createdDate": "2020-07-07T07:07:07+09:00",
        "version": "1.0",
        "apiKeySource": "HEADER",
        "endpointConfiguration": {
            "types": [
                "EDGE"
            ]
        }
    }
]

3.id属性の値をFQDNの先頭にセットして、次のURLにアクセスします。

$ curl https://<id>.execute-api.ap-northeast-1.amazonaws.com/Prod/hello/

AWSから削除

1.AWSにデプロイしたサンプルアプリケーションを削除します。sam-appという名称のCloudFormationスタックを削除します。

$ aws cloudformation delete-stack --stack-name sam-app --profile hogehoge

さいごに

VirtualBoxが不要となり、Docker自体が非常に軽くなりました。Windows環境でも、AWS CLI/AWS SAM CLIを快適に利用できるようになり、作業が捗ります。