🐨

Azure App ServiceにSSH接続したい

2024/04/16に公開

前提

・コンテナー化されたWebアプリをApp Serviceにデプロイ中
・アプリはFastAPI製
・Container管理にAzure Container Registryを使用

ドキュメント通り進める

以下の公式ドキュメントをもとにDockerfileに追記してカスタムコンテナを構成していきます。

https://learn.microsoft.com/ja-jp/azure/app-service/configure-custom-container?tabs=debian&pivots=container-linux

1. SSHを有効にする

sshd_configファイルをルートディレクトリに作成

sshd_config
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
Subsystem sftp internal-sftp


2. エントリーポイントスクリプトを作成

アプリケーション起動コマンドとSSH接続開始コマンドを記載したファイルをルートディレクトリに作成します。

entrypoint.sh
#!/bin/sh
set -e
service ssh start
exec gunicorn app:app


3. Dockerfileを作成

最後にDockerfileを作成します。
既にあるので、既存のファイルに追記していきます。

FROM python:3.9

WORKDIR /code

COPY entrypoint.sh .

RUN apt-get update \
    && apt-get install -y --no-install-recommends dialog \
    && apt-get install -y --no-install-recommends openssh-server \
    && echo "root:Docker!" | chpasswd \
    && chmod u+x ./entrypoint.sh

COPY sshd_config /etc/ssh/

EXPOSE 3100 2222

ENTRYPOINT [ "./entrypoint.sh" ] 

4. デプロイ

Azure DevopsのPipelineを使ってデプロイしているので追加分をPushしてPipelineを実行

エラーが出た

デプロイしてみたところ503エラーになりました。
ログストリームを確認したところ以下のエラー文が出てました。必要なフォルダがないようです。

「ERROR]cp: target /etc/pki/ca-trust/source/anchors' is not a directory

解決

エラー文通り、/etc/pki/ca-trust/source/anchorsフォルダを作成するコマンドを追加します。

FROM python:3.9

WORKDIR /code

COPY entrypoint.sh .

// 追加
RUN mkdir -p /etc/pki/ca-trust/source/anchors

RUN apt-get update \
    && apt-get install -y --no-install-recommends dialog \
    && apt-get install -y --no-install-recommends openssh-server \
    && echo "root:Docker!" | chpasswd \
    && chmod u+x ./entrypoint.sh

COPY sshd_config /etc/ssh/

EXPOSE 3100 2222

ENTRYPOINT [ "./entrypoint.sh" ] 

再度デプロイします。

また別のエラーが出た

次はentrypoint.shへの実行権限がないとのこと。

ERROR - Container start failed for <resource name> 1 2262eac2 with system. AggregateException, One or more errors occurred. (Docker API responded with status code=BadRequest, response=("message": "failed to create shim task: OCI runtime create failed: run create failed: unable to start container process: exec: |". /entrypoint.shl": permission ¡denied: unknown"}) InnerException: Docker. DotNet. DockerApiException, Docker API responded with status code=BadRequest, response= "message": "failed to create shim task: OCI runtime create failed: run create failed: unable to start container process: exec: \"./entrypoint.sh\": permission denied: unknown"}


権限をつけるコマンドは入れているから、ファイルに参照できてないのかもしれない。
いろいろ調べてみたところ、どうやら相対パスなのが良くないらしい

解決

相対パスから絶対パスに変更します。

FROM python:3.9

WORKDIR /code

// 絶対パスに変更
COPY entrypoint.sh /

RUN mkdir -p /etc/pki/ca-trust/source/anchors

RUN apt-get update \
    && apt-get install -y --no-install-recommends dialog \
    && apt-get install -y --no-install-recommends openssh-server \
    && echo "root:Docker!" | chpasswd \
    && chmod u+x /entrypoint.sh

COPY sshd_config /etc/ssh/

EXPOSE 3100 2222

// 絶対パスに変更
ENTRYPOINT [ "/entrypoint.sh" ] 

再度デプロイ

検証

SSH接続できました。

ヘッドウォータース

Discussion