Cloud Native BuildpacksでビルドしたOCIイメージ(making/hello-cnb)をAzure App Serviceにデプロイします。
目次
Resource Group作成
export TENANT_ID=****
export CLIENT_ID=****
export CLIENT_SECRET=****
export LOCATION="Japan East"
export RESOURCE_GROUP=hello-cnb
az login --username ${CLIENT_ID} \
--password ${CLIENT_SECRET} \
--service-principal \
--tenant ${TENANT_ID}
az group create --name ${RESOURCE_GROUP} --location "${LOCATION}"
Service Plan作成
次のコマンドでService Planをデプロイします。
az appservice plan create \
--resource-group ${RESOURCE_GROUP} \
--name hello-cnb-plan \
--sku B1 \
--is-linux
アプリケーションのデプロイ
次のコマンドでdocker-compose.ymlを作成します。
mkdir deploy-to-appservice
cd deploy-to-appservice
cat <<'EOF' > docker-compose.yml
version: '3.3'
services:
hello-cnb:
ports:
- 8080:8080
image: making/hello-cnb:latest
restart: always
environment:
INFO_MESSAGE: Hello World!
EOF
次のコマンドでアプリケーションをデプロイします。
az webapp create \
--resource-group ${RESOURCE_GROUP} \
--plan hello-cnb-plan \
--name hello-cnb \
--multicontainer-config-type compose \
--multicontainer-config-file docker-compose.yml
コンテナのDNS名を変数に設定します。
DNS_NAME=$(az webapp show --name ${RESOURCE_GROUP} --resource-group ${RESOURCE_GROUP} --name hello-cnb --query defaultHostName --output tsv)
アプリにアクセスします。初回アクセスにすごく時間がかかります...
$ curl https://${DNS_NAME}/actuator/health -w '\n'
{"status":"UP"}
$ curl https://${DNS_NAME}/actuator/info -w '\n'
{"message":"Hello World!"}
az webapp log tailのコマンドでログを確認します。すごく時間がかかります...
次のようなログが出力されます。
$ az webapp log tail --resource-group ${RESOURCE_GROUP} --name hello-cnb
2020-04-29 05:06:21.805 INFO - Starting container for site
2020-04-29 05:06:21.805 INFO - docker run -d -p 6066:8080 --name hello-cnb_hello-cnb_1_50ff53b8 -e WEBSITE_SITE_NAME=hello-cnb -e WEBSITE_AUTH_ENABLED=False -e WEBSITE_ROLE_INSTANCE_ID=0 -e WEBSITE_HOSTNAME=hello-cnb.azurewebsites.net -e WEBSITE_INSTANCE_ID=2918a08188b6922e8f91237a3e69a2a1ede53c68eb3b2b08b0e12615910d5a00 -e HTTP_LOGGING_ENABLED=1 making/hello-cnb:latest
2020-04-29 05:08:06.253 INFO - Started multi-container app
2020-04-29 05:08:06.309 INFO - Initiating warmup request to container hello-cnb_hello-cnb_1_50ff53b8 for site hello-cnb
2020-04-29 05:08:06.331 INFO - Container hello-cnb_hello-cnb_1_50ff53b8 for site hello-cnb initialized successfully and is ready to serve requests.
2020-04-29T05:06:36.608019851Z Container memory limit unset. Configuring JVM for 1G container.
2020-04-29T05:06:36.707085407Z Calculated JVM Memory Configuration: -XX:MaxDirectMemorySize=10M -XX:MaxMetaspaceSize=88833K -XX:ReservedCodeCacheSize=240M -Xss1M -Xmx447742K (Head Room: 0%, Loaded Class Count: 13270, Thread Count: 250, Total Memory: 1073741824)
2020-04-29T05:06:59.357607735Z
2020-04-29T05:06:59.357654735Z . ____ _ __ _ _
2020-04-29T05:06:59.357662035Z /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
2020-04-29T05:06:59.357667235Z ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
2020-04-29T05:06:59.357671835Z \\/ ___)| |_)| | | | | || (_| | ) ) ) )
2020-04-29T05:06:59.357676335Z ' |____| .__|_| |_|_| |_\__, | / / / /
2020-04-29T05:06:59.357680635Z =========|_|==============|___/=/_/_/_/
2020-04-29T05:06:59.357685036Z :: Spring Boot :: (v2.2.6.RELEASE)
2020-04-29T05:06:59.357689436Z
2020-04-29T05:07:02.004420287Z 2020-04-29 05:07:01.982 INFO 1 --- [ main] hello.HelloCnbApplication : Starting HelloCnbApplication on 4c26c3493057 with PID 1 (/workspace/BOOT-INF/classes started by cnb in /workspace)
2020-04-29T05:07:02.004492987Z 2020-04-29 05:07:01.994 INFO 1 --- [ main] hello.HelloCnbApplication : No active profile set, falling back to default profiles: default
2020-04-29T05:07:44.148327019Z 2020-04-29 05:07:44.135 INFO 1 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 3 endpoint(s) beneath base path '/actuator'
2020-04-29T05:08:01.400064423Z 2020-04-29 05:08:01.374 INFO 1 --- [ main] o.s.b.web.embedded.netty.NettyWebServer : Netty started on port(s): 8080
2020-04-29T05:08:01.520034093Z 2020-04-29 05:08:01.508 INFO 1 --- [ main] hello.HelloCnbApplication : Started HelloCnbApplication in 68.369 seconds (JVM running for 83.341)
Docker起動時にmemoryの指定がされておらず、Memory Calculatorが自動で1GBにフォールバックしています。Dockerが使用するメモリを指定する方法はない...?
https://hello-cnb.scm.azurewebsites.net/api/logs/dockerにアクセスするとdockerログを参照できるので、こちらでも確認できます。
アプリケーションの削除
次のコマンドでアプリを削除します。
az webapp delete --resource-group ${RESOURCE_GROUP} --name hello-cnb
az group delete --name ${RESOURCE_GROUP} --yes
コンテナのメモリ指定方法がわかりませんでした。できないのであればデプロイ先としてAzure App Serviceは適切ではなさそうです。