nemui

Amazon Linux 2023 で microsoft/apm (Agent Package Manager) を使う

2026/05/08
  • #aws
  • #ai

Amazon Linux 2023 上で apm を動かそうとすると、以下のようなエラーが表示されます。

[PYI-37236:ERROR] Failed to load Python shared library '.../github-microsoft-apm/0.11.0/_internal/libpython3.12.so.1.0': /lib64/libm.so.6: version `GLIBC_2.38' not found (required by .../github-microsoft-apm/0.11.0/_internal/libpython3.12.so.1.0)

これは、Amazon Linux 2023 の GLIBC のバージョンが、apm が利用する2.38より古い2.34であることが原因です。
解決方法としては apm をソースから入れなおす、もしくは、Docker を利用するといった方法があります。
以下では Docker を利用する方法について解説します。


Dockerfileの作成

以下のような Dockerfile を作成します。

FROM ubuntu:24.04@sha256:c4a8d5503dfb2a3eb8ab5f807da5bc69a85730fb49b5cfca2330194ebcc41c7b

ARG APM_VERSION=0.12.2

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update \
    && apt-get install -y --no-install-recommends ca-certificates curl git tar \
    && rm -rf /var/lib/apt/lists/*

RUN arch="$(dpkg --print-architecture)" \
    && case "${arch}" in \
        amd64) apm_arch="x86_64" ;; \
        arm64) apm_arch="arm64" ;; \
        *) echo "Unsupported architecture: ${arch}" >&2; exit 1 ;; \
      esac \
    && curl -fsSL "https://github.com/microsoft/apm/releases/download/v${APM_VERSION}/apm-linux-${apm_arch}.tar.gz" -o /tmp/apm.tar.gz \
    && mkdir -p /opt/apm \
    && tar -xzf /tmp/apm.tar.gz -C /opt/apm \
    && ln -sf "/opt/apm/apm-linux-${apm_arch}/apm" /usr/local/bin/apm \
    && rm -f /tmp/apm.tar.gz

ENTRYPOINT ["apm"]

mise task の作成

実行しやすくするために mise の task を作成します。
(※ GitHubのPrivateリポジトリからスキルをインストールしたい場合は gh auth token 等でトークンをDocker内に流し込む必要があります 参考)

#!/usr/bin/env bash
#MISE description="Ubuntu 24 Docker で microsoft/apm を実行"
#Amazon Linux 2023 は GLIBC のバージョンが古く、microsoft/apm のバイナリを直接実行できない為
set -euo pipefail

script_dir=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
repo_root=$(cd -- "${script_dir}/../../.." && pwd)
dockerfile="${repo_root}/.config/docker/apm/Dockerfile"
build_context=$(dirname -- "${dockerfile}")
apm_version="${APM_VERSION:-0.12.2}"
image_name="${APM_DOCKER_IMAGE:-apm:${apm_version}}"
cache_dir="${HOME}/.cache/apm"

mkdir -p "${cache_dir}"

docker build \
  --quiet \
  --build-arg "APM_VERSION=${apm_version}" \
  --tag "${image_name}" \
  --file "${dockerfile}" \
  "${build_context}" \
  >/dev/null

worktree_rel=$(realpath --relative-to="${repo_root}" "${PWD}")
container_workdir="/workspace"
if [[ "${worktree_rel}" != "." ]]; then
  container_workdir="/workspace/${worktree_rel}"
fi

docker_run_args=(
  run
  --rm
  --interactive
  --user "$(id -u):$(id -g)"
  --workdir "${container_workdir}"
  --volume "${repo_root}:/workspace"
  --volume "${cache_dir}:/tmp/apm-home"
  --env HOME=/tmp/apm-home
  --env XDG_CACHE_HOME=/tmp/apm-home/.cache
)

if [[ -f "${HOME}/.gitconfig" ]]; then
  docker_run_args+=(
    --volume "${HOME}/.gitconfig:/tmp/apm-home/.gitconfig:ro"
    --env GIT_CONFIG_GLOBAL=/tmp/apm-home/.gitconfig
  )
fi

exec docker "${docker_run_args[@]}" "${image_name}" "$@"

ファイルを以下のように配置します。

📁 .
└── 📁 .config
    ├── 📁 docker
    │   └── 📁 apm
    │       └── 📄 Dockerfile
    └── 📁 mise
        └── 📁 tasks
            └── 📄 apm

以下のように実行できます。

mise run apm -- install

以上です。