FURYU Tech Blog - フリュー株式会社

フリュー株式会社の開発者が技術情報を発信するブログです。

AWS SSO環境のDocker運用でハマった話 〜miseとローカル実行でAD管理ツールを救う〜

はじめに

こんにちは、ピクトリンク開発で運用保守を担当している藤本です。

今回、Active Directory(AD)のアカウント運用を効率化するために、AWS Secrets Managerからパスワードを取得してLDAP操作を行うPythonスクリプトを開発しました。 当初は開発環境のポータビリティを考えてDockerで構築していましたが、AWS SSOの認証情報共有において、WSL環境とMac環境で挙動が異なるという「環境の壁」にぶつかりました。

本記事では、Dockerに固執するのを辞め、miseを活用したローカル実行に切り替えて課題を解決したプロセスを紹介します。


直面した課題:Mac環境での「認証情報の壁」

当初、このツールは環境のポータビリティを重視し、すべての依存関係を Docker コンテナに閉じ込める設計にしていました。ホスト側の~/.awsをマウントすることで、コンテナ内からも AWS SSO のセッションを利用できる想定でした。

しかし、WSL環境では動くのに、Macユーザーが実行すると以下のようなエラーが発生しました。

ad-user-inventory-container-1  | Using AWS Profile: aws-sso
ad-user-inventory-container-1  | Checking AWS session...
ad-user-inventory-container-1  | Error: AWS session is expired or not logged in.
ad-user-inventory-container-1  | Please run 'aws sso login --profile aws-sso' on your HOST machine first.

なぜ認証が通らないのか

ホスト側で aws sso login は成功しており、aws sts get-caller-identityも正常に値を返します。それなのにコンテナ内に入ると「セッション切れ」と言われてしまう。

これは Mac 版 Docker Desktop におけるファイルシステムのマウント特性や、~/.aws/sso/cache内のトークンファイルへのアクセス権・パス解釈の差異が原因と思われます。この「Dockerを動かすためのデバッグ」に時間を溶かすのは、本質的な課題解決ではないと判断しました。


解決策:Dockerを卒業し、miseによるローカル実行へ

「Dockerを使うこと」は手段であり、目的は「AD運用を安全かつ確実に行うこと」です。認証情報の取り回しでハマるくらいなら、ホストの認証情報をそのまま使えるローカル環境こそが最適解であるという結論に至りました。

そこで、ランタイムマネージャーのmiseを活用し、誰でも同じ Python 環境を再現できるフローを構築しました。

新しい実行フロー

ローカル環境を汚さず、かつ確実に認証を通すためのセットアップ手順がこちらです。

# 1. miseでプロジェクト固有のPythonバージョンを固定・インストール
# .tool-versions に python 3.12.6 を記述
mise use python@3.12.6
mise install

# 2. 仮想環境の構築と依存ライブラリのインストール
python -m venv .venv
source .venv/bin/activate
pip install pandas python-ldap python-dotenv openpyxl

# 3. AWS SSO ログイン(ホストの認証情報をそのまま使用)
export AWS_PROFILE=aws-sso
aws sso login --profile $AWS_PROFILE --no-browser

# 4. セッションが有効であることを確認
aws sts get-caller-identity --profile $AWS_PROFILE

# 5. ADチェックスクリプトの実行
python ./check_active_ad_users.py

この切り替えによるメリット
  1. 認証の安定性: ホストの AWS CLI が保持しているセッションをそのまま利用するため、コンテナ越しに発生していた認証トラブルが皆無になりました。
  2. 高速なフィードバック: コンテナのビルドや起動待ちがなくなり、スクリプトの実行が非常にスムーズになりました。
  3. OSネイティブの恩恵: python-ldap のようにビルドにOS固有のライブラリ(libldap2-dev 等)を必要とするパッケージも、各環境(WSL/Mac)で適切に管理できるようになりました。

おわりに

Dockerは非常に強力なツールですが、AWS SSOのように「ホスト側のログイン状態」に深く依存するワークフローでは、無理にコンテナ化することが開発体験を損なうケースもあります。

今回の判断を通じて、「解決すべき本質的な課題は何か?」を問い直し、状況に応じてmiseのような柔軟なツールを選択することの重要性を再認識しました。

同じように「Docker環境でのAWS認証共有」で消耗している方の参考になれば幸いです。