CCCMKホールディングス TECH LABの Tech Blog

TECH LABのエンジニアが技術情報を発信しています

ブログタイトル

Azure App Service(Container Linux環境)のPythonアプリにDatadogを仕込む

テックラボの高橋です。今回は小ネタです。

Azure App ServiceのContainer Linux環境ではDockerコンテナを動かすことができます。

最近、オブザーバビリティツールであるDatadogをこの環境に組み込む機会がありました。 Datadogのドキュメントによると、以下のようにDockerfileに記述することでDatadogにログやトレースを送ることができるようです。

COPY --from=datadog/serverless-init:1 /datadog-init /app/datadog-init
RUN pip install --target /dd_tracer/python/ ddtrace
ENV DD_SERVICE=datadog-demo-run-python
ENV DD_ENV=datadog-demo
ENV DD_VERSION=1
ENTRYPOINT ["/app/datadog-init"]
CMD ["/dd_tracer/python/bin/ddtrace-run", "python", "app.py"]

docs.datadoghq.com

ところで、Azure App Serviceにはアプリの実行環境にsshする機能が存在します。 コードデプロイの環境の場合は特に問題ありませんが、カスタムコンテナ環境の場合はAzureのドキュメントに従ってssh serviceを設定しなければいけません。

下記のドキュメントで案内されている方法が、entrypoint.shでserviceの開始とアプリの起動を行う手法です。

learn.microsoft.com

DatadogとAzure App Serviceのsshを同時に利用する場合、ENTRYPOINTをどのように設定すれば良いでしょうか?

解決法

Datadogのドキュメントを読むと、datadog-initの引数としてはddtrace-run、ddtrace-runの引数としてアプリのコマンド(今回はPython)を設定すれば良いようでした。

DockerfileのENTRYPOINTとCMDはコンテナ起動時に以下のように実行されます。

ENTRYPOINT ["コマンド"]
CMD ["引数1", "引数2", …]

www.docker.com

上記を利用してentrypoint.shでCMDの値を受けるように変更を行い、動作させることができました。 2025/02/27現在動作した設定は以下となります。

Dockerfile

FROM python:3.12

WORKDIR /workdir

# Start and enable SSH
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
RUN mkdir -p /etc/startup
COPY sshd_config /etc/ssh/

# datadog
COPY --from=datadog/serverless-init:1 /datadog-init /datadog/datadog-init
RUN pip install --target /dd_tracer/python/ ddtrace
COPY requirements.txt .
RUN pip install -U pip
RUN pip \
        --trusted-host pypi.python.org \
        --trusted-host files.pythonhosted.org \
        --trusted-host pypi.org \
        --default-timeout=1000 \
        install -r /workdir/requirements.txt

# copy ssh entry point
COPY entrypoint.sh /etc/startup
RUN chmod u+x /etc/startup/entrypoint.sh

EXPOSE 8080 2222
COPY ./*.py /workdir/

# datadog and ssh setting
ENTRYPOINT ["/etc/startup/entrypoint.sh"]  # entrypoint.sh内でsshdとdatadog-initを起動
CMD ["gunicorn","--bind", "0.0.0.0:8080", "--worker-class", "aiohttp.worker.GunicornWebWorker", "--timeout", "600", "app:APP"]

entrypoint.sh

#!/bin/sh
set -e
service ssh start

echo "entrypoint args"
echo $@  # entrypoint.shの引数 == DockerfileのCMD

/datadog/datadog-init /dd_tracer/python/bin/ddtrace-run $@

Pythonでの例として、以下のようなaiohttp製アプリの出力をDatadogで確認してみます。

app.py

import sys
import logging

from aiohttp import web
from aiohttp.web import json_response

logging.basicConfig(stream=sys.stdout)  # 標準出力に設定
logger = logging.getLogger("app")
logger.setLevel("INFO")

async def check(_):
    logger.info("datadogに出力されていますか?")
    return json_response(
        data={"message": "test response"},
        status=200)

APP = web.Application()
APP.router.add_get("/api/check", check)

if __name__ == "__main__":
    web.run_app(APP, host="0.0.0.0", port=8080)

環境変数は以下のようにApp Serviceから設定します。

すると、無事にApp ServiceからDatadogにログ送信できたようです。

なお、sshも有効になっていました。

コンテナでの開発時には、--entrypoint ""と指定することでentrypoint.shを利用しないこともできます。

 docker run -it --entrypoint "" --rm -p xxxx:8080 -v `pwd`:/workdir xxxx bash

おわりに

今回は小ネタでしたが、Azure App ServiceのLinux ContainerをDatadogと連携する方法を紹介しました。

DatadogとAzureの連携には他にも様々な機能があるようですので、面白いものがありましたらあらためて共有させていただきます。