⛰️
GCS FUSEでGitHubコードをCloud Runにマウントする方法
2024-12-04
約2442字
この記事は、GCP(Google Cloud Platform) Advent Calendar 2024の4日目の記事です。
今回は、Cloud Storage FUSE (以下、GCS FUSE) という仕組みを使ってCloud Run JobからGCS上に置かれたGitHubのソースコードを操作する方法を紹介します。
以前、私はCloud Run上でGitHubで管理されたソースコードを解析し、結果をBigQueryに書き出す際に、この仕組みを試しました。
任意のタイミングで、ソースコードは変わるので、その都度 Cloud RunをBuild & Deployし直すのはナシです。
GCS FUSEは、Cloud Storage バケットをファイルシステムとしてマウントするオープンソースの仕組みです。
これにより、Cloud Run(第二世代)などのシステムからGCSバケット内のファイルの読み書きが、OS内のローカルファイルと同じ容量で操作できます。
まず、以下のようなDockerfileを作成します。GCS RUSEのモジュールをインストールします。
FROM python:3.11-buster
RUN set -e; \
apt-get update -y && apt-get install -y \
tini \
lsb-release; \
gcsFuseRepo=gcsfuse-`lsb_release -c -s`; \
echo "deb https://packages.cloud.google.com/apt $gcsFuseRepo main" | \
tee /etc/apt/sources.list.d/gcsfuse.list; \
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | \
apt-key add -; \
apt-get update; \
apt-get install -y gcsfuse \
&& apt-get clean
ENV MNT_DIR /mnt/gcs
# Install google-cloud-sdk
RUN curl -sSL https://sdk.cloud.google.com | bash
ENV PATH $PATH:/root/google-cloud-sdk/bin
ENV APP_HOME /app
ENV ROOT /root
WORKDIR $APP_HOME
COPY . ./
RUN chmod +x /app/execute.sh
ENTRYPOINT ["/usr/bin/tini", "--"]
次に、Cloud Run Jobの実行時にキックされるスクリプトは以下になります。
gcsfuseコマンドで、GCSパスとマウントするdir名を指定します。
また、gitの操作をするため、事前に ID_GITHUB
というSSH秘密鍵をシークレットマネージャに置いておき、それをCloud Run内のRoot dirに配置します
#!/usr/bin/env bash
set -eo pipefail
# Create mount directory for service
mkdir -p $MNT_DIR
echo "Mounting GCS Fuse."
gcsfuse --debug_gcs --debug_fuse $BUCKET $MNT_DIR
echo "Mounting completed."
# set SSH key
mkdir -p ${ROOT}/.ssh
gcloud secrets versions access latest --secret=ID_GITHUB >> ${ROOT}/.ssh/id_github
chmod 400 ${ROOT}/.ssh/id_github
ssh-keyscan github.com >> ${ROOT}/.ssh/known_hosts
echo -e "Host github.com\n HostName github.com\n IdentityFile ${ROOT}/.ssh/id_github\n User git\n StrictHostKeyChecking no" >> ${ROOT}/.ssh/config
chmod 700 ${ROOT}/.ssh
if [ -d "${MNT_DIR}/${REPO_NAME}" ]; then
cd ${MNT_DIR}/${REPO_NAME}
git pull origin main
else
git clone git@github.com:${ORG_NAME}/${REPO_NAME}.git
fi
python3 main.py
これで、 main.py
を実行して対象のGitHub内ソースを取得・加工・連携する流れです。
今回、GitHubソースコードが置かれたGCSをCloud Runにマウントする方法を紹介しました。
ちなみに当初は、PythonのGitHub clientを使いAPI経由で操作することを検討しましたが、APIの利用制限にすぐに引っかかってしまったので、今回の方法に落ち着きました。
とはいえ、GCS上のファイルに一つ一つアクセスすると、それなりにIOに時間がかかったりするので、実際のCloud Runにコピーして操作するなどする工夫も必要でした。
©︎ 2025 - Yard