WSL2のUbuntu 20.04をcloud-initで構築してLocalStackを使ってみる
はじめに
WLS2のUbuntuでもcloud-initが使用できる。
「WSL2上のUbuntu 20.04でLocalStackを使ってみる」の手順をcloud-init化してみる。
動作確認環境
- Windows 10 バージョン: 21H1 / OSビルド: 19044.1526
- Windows Terminal 1.11.3471.0
Ubuntu-20.04の準備
Ubuntu-20.04をインストールと起動
Ubuntu-20.04をインストールする。[1]
> wsl --install -d Ubuntu-20.04
新規でコマンドラインウインドウが開く。
ユーザー名(ubuntu)とパスワードの設定を行う。
$プロンプトでexitする。
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: ubuntu
New password:
Retype new password:
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 5.10.16.3-microsoft-standard-WSL2 x86_64)
〜中略〜
This message is shown once a day. To disable it please create the
/home/ubuntu/.hushlogin file.
ubuntu@AA:~$ exit
cloud-init設定ファイルの準備
「C:\wsl2\cloud-init」以下に設定ファイルを準備する。
設定ファイルの置き場所はWSL2から参照できるところならどこでも良い。
設定ファイルの置き場所を変える場合は、設定のパスを書き換えましょう。
下記のようなフォルダー構成で、3個のファイルを作成する。
C:\WSL2
└─cloud-init
├── cloud-init.sh
├── meta-data
├── user-data
dsmode: local
#cloud-config
locale: en_US.UTF8
timezone: Asia/Tokyo
users:
- name: ubuntu
sudo: ALL=(ALL) NOPASSWD:ALL
package_upgrade: true
packages:
- apt-transport-https
- ca-certificates
- curl
- gnupg
- lsb-release
- zip
- jq
- python3-pip
runcmd:
- echo "runcmd--------------------"
- curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
- echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- echo "apt-get--------------------"
- apt-get -y update
- apt-get -yV upgrade
- echo "docker--------------------"
- apt-get install -y docker-ce docker-ce-cli containerd.io
- curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
- chmod +x /usr/local/bin/docker-compose
- usermod -aG docker ubuntu
#!/bin/sh
export DEBUG_PROC_CMDLINE="ds=nocloud;seedfrom=/mnt/c/wsl2/cloud-init/"
cloud-init init --local
cloud-init init
cloud-init modules --mode=config
cloud-init modules --mode=final
cloud-initの実行
Windows TerminalからrootユーザーでWSL2へログインする。
cloud-init.shを実行する。
WSL2から抜けて終了する。
> wsl ~ -u root
root@AA:~# find /mnt/c/wsl2/cloud-init -type f -exec sed -i 's/\r//g' {} \;
root@AA:~# cd /mnt/c/wsl2/cloud-init
root@AA:/mnt/c/wsl2/cloud-init# ./cloud-init.sh
Cloud-init v. 21.4-0ubuntu1~20.04.1 running 'init-local' at Wed, 09 Feb 2020 00:00:00 +0000. Up 352.34 seconds.
2020-01-01 00:00:00,905 - __init__.py[WARNING]: Skipping creation of existing group 'docker'
Generating public/private rsa key pair.
〜中略〜
初回実行時に途中でy/n選択がでる。yを選択して進める。
〜中略〜
mnt/c/wsl2/cloud-init/][dsmode=local]. Up ???.?? seconds
root@AA:/mnt/c/wsl2/cloud-init# exit
> wsl --shutdown
user-dataを変更している場合に、実行途中でエラー表示がされていることがある。
スクロールしてログさかのぼり確認すると問題を見つけることができる。
Ubuntu 20.04の設定
WSL2へubuntuユーザーでログインする。
> wsl ~ -u ubuntu
BashとvimのBeep音を止める。(ログインし直すと反映される、)
ubuntu@AA:~$ echo "set bell-style none" >> ~/.inputrc
ubuntu@AA:~$ echo "set visualbell t_vb=" >> ~/.vimrc
Dockerサービスを起動する。
ubuntu@AA:~$ sudo service docker start
* Starting Docker: docker
[ex] ログイン時にDockerサービスを起動する
.bashrcに設定を追加する。
echo 'service docker status > /dev/null 2>&1
if [ $? = 1 ]; then
sudo service docker start
fi' >> ~/.bashrc
Dockerでhello-worldを実行できるか確認する。
ubuntu@AA:~$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
000000000000: Pull complete
Digest: sha256:000000000000000000000000000000000000000000000000
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
〜後略〜
LocalStackの準備
docker-compose.ymlを準備する
LocalStackをGitHubからダウンロードして解凍する。[2]
ubuntu@AA:~$ curl -L -O https://github.com/localstack/localstack/archive/refs/tags/v0.13.0.zip
ubuntu@AA:~$ unzip v0.13.0.zip
docker-compose.ymlを編集する
ubuntu@AA:~$ vi localstack-0.13.0/docker-compose.yml
変更点
v0.13.1に固定。Pro用の設定を削除。IP設定(127.0.0.1:)削除[3][4]。Lambda用設定のLAMBDA_EXECUTORを追加。[5]
version: "3.8"
services:
localstack:
container_name: "${LOCALSTACK_DOCKER_NAME-localstack_main}"
image: localstack/localstack:0.13.1
network_mode: bridge
ports:
- "4566:4566"
- "4571:4571"
environment:
- SERVICES=${SERVICES- }
- DEBUG=${DEBUG- }
- DATA_DIR=${DATA_DIR- }
- LAMBDA_EXECUTOR=${LAMBDA_EXECUTOR- }
- LOCALSTACK_API_KEY=${LOCALSTACK_API_KEY- } # only required for Pro
- HOST_TMP_FOLDER=${TMPDIR:-/tmp/}localstack
- DOCKER_HOST=unix:///var/run/docker.sock
- LAMBDA_EXECUTOR=docker-reuse
volumes:
- "${TMPDIR:-/tmp}/localstack:/tmp/localstack"
- "/var/run/docker.sock:/var/run/docker.sock"
docker-compose.ymlの編集を保存して終了する。(viだとescキーを押す。「:wq」を入力してエンターキーを押す。)
起動する
docker-composeを使って起動する。[6]
ubuntu@AA:~$ cd localstack-0.13.0
ubuntu@AA:~/localstack-0.13.0$ docker-compose up -d
Pulling localstack (localstack/localstack:)...
a10c77af2613: Pull complete
〜中略〜
Digest: sha256:3fcef2507cd96b64a5efd94ab25e95fa58b46e97c1217e3c0e3cec352d8376ee
Status: Downloaded newer image for localstack/localstack:0.13.1
Creating localstack_main ... done
起動状況を確認をする。
ubuntu@AA:~/localstack-0.13.0$ docker-compose ps
Name Command State Ports
---------------------------------------------------------------------------------------------------------------------------------------------
localstack_main docker-entrypoint.sh Up 0.0.0.0:4566->4566/tcp,:::4566->4566/tcp, 0.0.0.0:4571->4571/tcp,:::4571->4571/tcp, 5678/tcp
[ex] docker-composeを使って停止する。
ubuntu@AA:~/localstack-0.13.0$ docker-compose down
サービスの起動状況チェック
LocalStackで使用できるサービスの起動状況を確認する。[7]
ubuntu@AA~/localstack-0.13.0$ curl -s http://localhost:4566/health | jq
{
"features": {
"initScripts": "initialized"
},
"services": {
"acm": "available",
"apigateway": "available",
"cloudformation": "available",
"cloudwatch": "available",
"config": "available",
"dynamodb": "available",
"dynamodbstreams": "available",
"ec2": "available",
"es": "available",
"events": "available",
"firehose": "available",
"iam": "available",
"kinesis": "available",
"kms": "available",
"lambda": "available",
"logs": "available",
"redshift": "available",
"resource-groups": "available",
"resourcegroupstaggingapi": "available",
"route53": "available",
"route53resolver": "available",
"s3": "available",
"secretsmanager": "available",
"ses": "available",
"sns": "available",
"sqs": "available",
"ssm": "available",
"stepfunctions": "available",
"sts": "available",
"support": "available",
"swf": "available"
}
}
LocalStackへアクセスする
AWS CLI Version 2セットアップ
awscliをダウンロードをしてインストールする。[8]
ubuntu@AA:~$ cd
ubuntu@AA:~$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
ubuntu@AA:~$ unzip awscliv2.zip
ubuntu@AA:~$ sudo ./aws/install
ubuntu@AA:~$ aws --version
aws-cli/2.4.17 Python/3.8.8 Linux/5.10.16.3-microsoft-standard-WSL2 exe/x86_64.ubuntu.20 prompt/off
ubuntu@AA:~$ rm -fr aws
ubuntu@AA:~$ rm awscliv2.zip
awscli-localをインストールする。
ubuntu@AA:~$ pip3 install awscli-local
コマンドが実行できるようにPATHを通す。
ubuntu@AA:~$ echo 'export PATH="$PATH:~/.local/bin"' >> ~/.bashrc
ubuntu@AA:~$ source ~/.bashrc
LocalStack接続用のダミー設定を作る。
ubuntu@AA:~$ aws configure --profile=localstack
AWS Access Key ID [None]: dummy
AWS Secret Access Key [None]: dummy
Default region name [None]: ap-northeast-1
Default output format [None]: json
S3
作成したバケットや追加したファイルは「docker-compose down」すると消えます。[9]
hoge-bucketバケットを作成する。
ubuntu@AA:~$ awslocal s3 mb s3://hoge-bucket --profile=localstack
make_bucket: hoge-bucket
hoge-bucketバケットが作成されていることを確認する。
ubuntu@AA:~$ awslocal s3 ls --profile=localstack
2020-09-02 22:36:16 hoge-bucket
hoge-bucketバケットにファイル追加と確認をする。
ubuntu@AA:~$ echo 'Test Hoge Hoge!' > hoge.txt
ubuntu@AA:~$ awslocal s3 cp hoge.txt s3://hoge-bucket --profile=localstack
upload: ./hoge.txt to s3://hoge-bucket/hoge.txt
ubuntu@AA:~$ awslocal s3 ls s3://hoge-bucket --profile=localstack
2020-09-02 22:38:45 16 hoge.txt
Lambda
Lambda Functionの準備
コードを作成します。
ubuntu@AA:~$ vi myFunction.py
S3で作った「hoge-bucket」バケットあることが前提のコードになっています。[10]
import os
import boto3
from boto3.session import Session
from datetime import datetime
session = Session(
aws_access_key_id='dummy',
aws_secret_access_key='dummy',
region_name='ap-northeast-1'
)
if os.getenv('LOCALSTACK_HOSTNAME') is None:
endpoint = 'http://localhost:4566'
else:
endpoint=f"http://{os.environ['LOCALSTACK_HOSTNAME']}:4566"
s3 = session.resource(
service_name='s3',
endpoint_url=endpoint
)
def lambda_handler(event, context):
bucket = 'hoge-bucket'
key = datetime.now().strftime('%Y-%m-%d-%H-%M-%S') + '.txt'
file_contents = 'Python Lambda Save File'
s3.Bucket(bucket).put_object(Key=key, Body=file_contents)
return 'create file '+ key
myFunction.pyの編集を保存して終了する。(viだとescキーを押す。「:wq」を入力してエンターキーを押す。)
zip形式で圧縮をする。
ubuntu@AA:~$ zip lambda.zip myFunction.py
Lambdaへの登録と実行
Functionを登録する。[11]
ubuntu@AA:~$ awslocal lambda create-function --function-name myFunction --runtime python3.8 --handler myFunction.lambda_handler --role r1 --zip-file fileb://lambda.zip --profile=localstack
{
"FunctionName": "myFunction",
"FunctionArn": "arn:aws:lambda:us-east-1:000000000000:function:myFunction",
"Runtime": "python3.8",
"Role": "r1",
"Handler": "myFunction.lambda_handler",
"CodeSize": 592,
"Description": "",
"Timeout": 3,
"LastModified": "2020-10-03T08:20:15.032+0000",
"CodeSha256": "SuHNSoLMS/zBPGAKiezjN/qL10Nntx2b3o5Z3SSivWY=",
"Version": "$LATEST",
"VpcConfig": {},
"TracingConfig": {
"Mode": "PassThrough"
},
"RevisionId": "a8380dc0-349f-4be4-949c-065a90431750",
"State": "Active",
"LastUpdateStatus": "Successful",
"PackageType": "Zip",
"Architectures": [
"x86_64"
]
}
Functionを実行する。[12]
ubuntu@AA:~$ awslocal lambda invoke --cli-binary-format raw-in-base64-out --function-name myFunction --profile=localstack result.log
ubuntu@AA:~$ cat result.log | jq
"create file2020-10-02-08-35-49.txt"
S3にファイルが追加されているか確認する。
ubuntu@AA:~$ awslocal s3 ls s3://hoge-bucket --profile=localstack
2020-10-02 08:35:49 23 2020-10-02-08-35-49.txt
参考にしたサイト
- WSL2上のUbuntu 20.04でLocalStackを使ってみる
- Mac向けMultipassのUbuntu 20.04でLocalStackを使ってみる
- Docker DesktopなしのDocker環境をWSL2とcloud-initで構築する - Qiita
- cmbntr/wsl-cloud-init: Starting cloud-init within a WSL2 container.
- docker: unrecognized service when installing CUDA - Ask Ubuntu
- WSL2でSSHサーバーを動かす: xshige's beta notes
-
Ubuntu-20.04が未インストール前提で書いている。アンインストールするかバックアップ・リストアして名前変更しましょう。→ WSL2コマンドメモ ↩︎
-
docker-compose.ymlが必要なだけなので他の取得方法でも良い。 ↩︎
-
localhostではなくIP指定でアクセスする必要がある。shellでIPアドレスは「ip addr」で確認できる。 ↩︎
-
さらに別のPCからアクセスしたい場合はポートフォワードとファイアウォールの設定が必要。WSL2で起動したサーバーに外部の端末からアクセスする – GUNMA GIS GEEK ↩︎
-
AMBDA_DOCKER_NETWORK=hostを設定すると「listen tcp :9001: bind: address already in use」エラーになる。 ↩︎
-
docker-compose up」を「-d」なしで起動するとログが確認できる。 ↩︎
-
サービスが起動するまで時間がかかりエラーになることもある。その場合は少し時間を空けてアクセスする。 ↩︎
-
Linux での AWS CLI バージョン 2 のインストール、更新、アンインストール - AWS Command Line Interface ↩︎
-
永続化する設定もある。 LocalStackに保存するデータを永続化する - CLOVER🍀 ↩︎
-
Lambda functionからS3やDynamoDBにアクセスする場合はos.environ['LOCALSTACK_HOSTNAME']でホスト名取得してendpointを設定する必要がある。 ↩︎
-
--handler myFunction.lambda_handlerはファイル名.ファンクション名で指定する必要がある。 ↩︎
-
初回はdocker imageのダウンロードが走るため起動まで少し時間がかかる。 ↩︎
Discussion