はじめに
こんにちは、ピクトリンク開発で運用保守を担当している藤本です。
今回、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
この切り替えによるメリット
- 認証の安定性: ホストの AWS CLI が保持しているセッションをそのまま利用するため、コンテナ越しに発生していた認証トラブルが皆無になりました。
- 高速なフィードバック: コンテナのビルドや起動待ちがなくなり、スクリプトの実行が非常にスムーズになりました。
- OSネイティブの恩恵:
python-ldapのようにビルドにOS固有のライブラリ(libldap2-dev 等)を必要とするパッケージも、各環境(WSL/Mac)で適切に管理できるようになりました。
おわりに
Dockerは非常に強力なツールですが、AWS SSOのように「ホスト側のログイン状態」に深く依存するワークフローでは、無理にコンテナ化することが開発体験を損なうケースもあります。
今回の判断を通じて、「解決すべき本質的な課題は何か?」を問い直し、状況に応じてmiseのような柔軟なツールを選択することの重要性を再認識しました。
同じように「Docker環境でのAWS認証共有」で消耗している方の参考になれば幸いです。