100件以上Viewされて恥ずかしくなったので別記事にもう少し詳しく書きました。
新しい記事はこちら
私は、WSL以外、環境にあるものを殆ど使ったことがなく基本的にjava屋さんです。
個々の要素については、先人が書かれている記事がありますので、ここでは記事が見つからなかったハマりポイントを備忘録として。
概要:
<テーマ>
「WSL2 + vscodeでlambda + dynamodbのローカル開発環境を作る」
<環境>
Windows 10 Insider Preview 20H1(19035)
WSL2(Ubuntu)
+ Python 3.7.5
+ pip 19.3.1
+ aws-cli 1.16.299
+ aws-sam-cli 0.37.0
docker desktop community 2.1.7.0(41536) edge
DynamoDB local (docker image : amazon/dynamodb-local)
Visual Studio Code 1.41.0
+ AWS Toolkit for Visual Studio Code 1.4.0
+ Remote - WSL 0.41.5
<前提など>
VSCode以外はWSL2のUbuntu上で完結する開発環境を作る。
クローズドネットワークでの開発を想定して、awsアカウント無しでやる。
ハマりポイント①:
vscode上で「AWS:Create new SAM Application」したのにlambda関数の上部にCodeLensの「Run Locally」が表示されない。
- vscodeウインドウ左部のAWSアイコンクリックして暫く待ってたらいつのまにか表示されるようになってた。
CodeLendsが有効になるタイミングが良くわかってなかったため、Extentionインストールしたら直ぐに表示されるもんだと思い込んでいて表示されずに暫くジタバタした。
ハマりポイント②:
AWS Toolkitから「Run Locally」した「SAM local」からdocker-compose upしたdynamodb localにアクセスできない。
- endpoint指定は「localhost」ではダメ。マシン名でもダメなのでPCに割り当てられたIPアドレス(コンテナ外で見える)を指定する。
# dockerコンテナなSAM localからだとlocalhostでつながらない。「イーサネット アダプター vEthernet (WSL):」のIPを指定。
dynamodb = boto3.resource('dynamodb', endpoint_url="http://your_ip_addr:8000")
SAM localとdynamodb localのコンテナを同じdocker networkに乗せるようにSAM_DOCKER_NETWORKを環境変数に設定して見たりしたが上手くいかず。
色々調べていたら、「dockerコンテナから別のコンテナにはlocalhostではアクセス出来ないよん」的な記事を見つけた。
少し考えてみれば、当該コンテナから見ればlocalhostは自分のコンテナなわけだから当たり前の話。。。
WSL2上で起動したdynamodb localのコンテナにWindows上からlocalhostでアクセス出来ていたから麻痺してた。。。
ただ、これだとネットワーク環境変わるたびにソース弄らないといけないので余り実用的ではないかも。
要改善。
SAMのコンテナからdynamodbのコンテナにリクエスト飛ばせるようにすれば良いとは思うのですが、現状ではdockerの勉強が足りません。
そのうち改善したらまた記事書きます。
私がdocker networkの仕様を全く勉強してなかったためという恥ずかしい話。
WSL2思ってたよりいいですね。
ディストリビューションのスナップショット作って切り替えられるようになれば、複数の開発環境を楽に作れてもっと良いのですが。。。
調べてませんが、ひょっとしたら出来るのかな?
まぁ、普通にHyper-V使えって話かもしれませんが。