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

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

DockerでAWS IAMユーザー管理を自動化しようとしたらハマった話

こんにちは、ピクトリンク開発で運用保守を担当している藤本です。 日々の業務でツールのアカウント管理をしているのですが、対象となるツールは20個以上。繁忙期にはアカウント追加や削除依頼が山のように来ます。これを毎回手動でやっていると、気が遠くなるくらい工数がかかるんですよね…。

そこで「もう自動化しよう!」と思い立ちました。 ただし、チームメンバーのPC環境はバラバラ。誰でも同じように動かせるようにDockerを使って仕組みを作ったのですが、まさかの落とし穴にハマってしまいました。

今日はそのときの失敗談と解決方法をシェアします。


何が起きたか?

AWS IAMユーザーを削除する処理を作り、ローカルのAWSプロファイル(~/.aws/config や credentials)をDockerにマウントしてAWS CLIを実行する仕組みを組みました。

しかし結果がこうなったんです👇

  • Ubuntu環境 → 「✅ ユーザーが存在します」

  • Mac環境 → 「❌ ユーザーが存在しません」

「え?ローカルのMacで直接AWS CLIを叩くとちゃんと動くのに、Docker経由だと動かないの??」 「Dockerって環境依存をなくすためのものじゃなかったの!?」

完全に混乱しました…。


原因は2つあった

いろいろ調べた結果、原因はこの2つでした。

  1. Pythonのコードの書き方
  2. ローカル環境のアーキテクチャの違い

問題① Pythonの書き方

AWS CLI には --output オプションがあり、text / table / json などの形式を選べます。 参考: [AWS CLI 公式ドキュメント]

docs.aws.amazon.com

当初は --output text を使って、IAMユーザー一覧の結果を文字列として受け取り、split()で分割して処理していました。

result = subprocess.run(
    ["aws", "iam", "list-users", "--profile", profile, "--query", "Users[].UserName", "--output", "text"],
    capture_output=True, text=True, check=True
)
usernames = result.stdout.split()

text 出力はスペース区切りの文字列になるので、ユーザー名にスペースや特殊文字が含まれると壊れる可能性があります。

修正後
result = subprocess.run(
    ["aws", "iam", "list-users", "--profile", profile, "--output", "json"],
    capture_output=True, text=True, check=True
)
users_json = json.loads(result.stdout)
usernames = [u["UserName"] for u in users_json.get("Users", [])]

JSON出力なら構造化データを安全に扱えるので、どんなユーザー名でも正しく取得できます。

さらに、ループ内で matched = [] を先に初期化しておくことで、例外時に変数未定義エラーにならないようにしました。

✅ これでMacでも正しくユーザーが検出できるようになりました。

問題② アーキテクチャの違い

もう1つの問題は、AWS CLIのアーキテクチャでした。

Dockerfileでは常にx86_64 用のAWS CLIを入れていたのですが、Mac(M1/M2)は arm64 で動いています。 そのため、コンテナ内で正しくAWS CLIが動作していなかったのです。

修正版 Dockerfile(抜粋)
# AWS CLI インストール
ARG TARGETARCH
RUN set -eux; \
    case "$TARGETARCH" in \
    amd64) ARCH=x86_64 ;; \
    arm64) ARCH=aarch64 ;; \
    *) echo "Unsupported arch: $TARGETARCH"; exit 1 ;; \
    esac; \
    curl "https://awscli.amazonaws.com/awscli-exe-linux-${ARCH}.zip" -o awscliv2.zip; \
    unzip awscliv2.zip; \
    ./aws/install; \
    rm -rf awscliv2.zip aws

✅ これで amd64(Ubuntuなど)でも arm64(Mac M1/M2)でも動くようになりました。

学び

  • AWS CLIの出力は text ではなく json にしたほうが安全

  • Dockerでもアーキテクチャ(amd64 / arm64)の違いに注意が必要

  • 「Dockerを使えばどこでも動く」とは限らない

最後に

「誰でも同じ環境で動かせるように」とDockerを使ったのに、まさかDocker自体にハマるとは思いませんでした…。 でも、こういう試行錯誤を経て仕組みがちゃんと動いたときの嬉しさは格別ですね。

もし同じように「DockerでAWS CLIを動かしてみたらMacだけうまくいかない…」と悩んでいる方がいたら、この記事が参考になれば幸いです。

読んでいただきありがとうございました!