🐈

Azure CLI からWeb App をデプロイした際のポータルからのSSH接続

2022/12/25に公開

はじめに

Web App for Containerを Azure CLIを使用してデプロイした際にポータルのSSH(SCM)を使用できるようにデプロイします。
普通にデプロイすると以下のようにアクセスできません。

access error

そこで、デプロイする際にSSH用の設定を追加で行っていきます。

https://learn.microsoft.com/ja-jp/azure/app-service/tutorial-custom-container?pivots=container-linux#configure-the-container-for-ssh

ディレクトリ

.
  ├── src
    ├── app.py
  ├── Dockerfile
  ├── sshd_config
  ├── init.sh

App Serivceのデプロイ

リソース等の設定値を定義します。

LOCATION=japaneast
RESOURCEGROUP_NAME=4kzknt-webapp-rg
ACR_NAME=4kzkntacr
ACR_SKU=Basic
DOCKER_TAG_NAME=4kzknt-tag-name
ASP_NAME=4kzkntwebappPlan
ASP_SKU=B1
APPSERVICE_NAME=4kzknt-webapp

リソースグループの作成

az group create --l $LOCATION -n $RESOUCE_GROUP_NAME

Dockerfileの作成

公式ドキュメントにも記載がありますとおり、コンテナーのポート2222を公開します。
https://learn.microsoft.com/ja-jp/azure/app-service/tutorial-custom-container?pivots=container-linux#configure-the-container-for-ssh

Python アプリを作成してみます。
requirements.txtの内容を以下にします。

Flask
gunicorn

app.py の内容を以下にします。

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return {'message': 'Hello world.'}

Dockerfileを以下の内容にします。

FROM python:3.10

WORKDIR /app

COPY . .

RUN pip install -r requirements.txt

# ssh setting
ENV SSH_PASSWD "root:Docker!"
RUN apt-get update \
        && apt-get install -y --no-install-recommends dialog \
        && apt-get update \
        && apt-get install -y --no-install-recommends openssh-server \
        && echo "$SSH_PASSWD" | chpasswd
# ssh用ファイルのコピー
COPY sshd_config /etc/ssh/

# プログラム起動用ファイルのコピーと権限付与
COPY init.sh /usr/local/bin/
RUN chmod u+x /usr/local/bin/init.sh

EXPOSE 8000 2222

ENTRYPOINT ["init.sh"]

スタートコマンドをinit.sh(スタートアップスクリプト)に記載しておきます。

#!/bin/bash
set -e

echo "Starting SSH ..."
service ssh start

gunicorn -w 2 -b 0.0.0.0 src.app:app

sshd_confg ファイルを作成します。

Port                    2222
ListenAddress           0.0.0.0
LoginGraceTime          180
X11Forwarding           yes
Ciphers aes128-cbc,3des-cbc,aes256-cbc,aes128-ctr,aes192-ctr,aes256-ctr
MACs                    hmac-sha1,hmac-sha1-96
StrictModes             yes
SyslogFacility          DAEMON
PasswordAuthentication  yes
PermitEmptyPasswords    no
PermitRootLogin         yes

Docker イメージを ACR にプッシュします。

az acr create --resource-group $RESOURCEGROUP_NAME --name $ACR_NAME --sku $ACR_SKU --admin-enabled true --location $LOCATION

az acr login --name $ACR_NAME

az acr credential show --resource-group $RESOURCEGROUP_NAME --name $ACR_NAME

docker build -t $ACR_NAME.azurecr.io/$DOCKER_TAG_NAME:latest .

docker tag $DOCKER_TAG_NAME $ACR_NAME.azurecr.io/$DOCKER_TAG_NAME:latest

docker push $ACR_NAME.azurecr.io/$DOCKER_TAG_NAME:latest

Web App For Container の作成
以下コマンドより、Web App for Container を作成します。

az appservice plan create --name $ASP_NAME --resource-group $RESOUCE_GROUP_NAME --sku $ASP_SKU --is-linux
		
az webapp create --resource-group $RESOUCE_GROUP_NAME --plan $ASP_NAME --name $APPSERVICE_NAME --deployment-container-image-name $ACR_NAME.azurecr.io/$DOCKER_TAG_NAME:latest

az webapp config appsettings set --resource-group $RESOUCE_GROUP_NAME --name $APPSERVICE_NAME --settings WEBSITES_PORT=80

az webapp identity assign --resource-group $RESOUCE_GROUP_NAME --name $APPSERVICE_NAME --query principalId --output tsv

Web App が作成されたら、いったん https://<app-name>.azurewebsites.net/ にアクセスすると以下のページが表示されます。

webapp

SSHアクセス

ポータルより、App service -> 開発ツール -> SSH で SSHにアクセスすると以下のようにアクセスできます。

ssh access

リソースのクリーンアップ

リソースグループの削除します。

az group delete -n $RESOUCE_GROUP_NAME

おわりに

Web App for Container をデプロイする際にSSHを公開しないとポータルより、SSH使用できないので、公開していただき、SSHサービスを実行していただければ今回のように使用できます。

Discussion