tech.guitarrapc.cóm

Technical updates

AWS CLIの認証情報をWSLとWindowsで共有する

前々からWindowsとWSL2 Ubuntuのどちらかで認証すればどちらでも使えるようにしていたのですが、ここ最近アップデートしたのでメモです。

AWS CLIの認証情報の保存場所

WindowsとWSL2 UbuntuでAWS CLIの認証情報はそれぞれ以下の場所に保存されます。

  • Windows: %USERPROFILE%/.aws/
  • WSL2 Ubuntu: $HOME/.aws/

幸いにして、OSが変わっても同フォルダ以下の構成は変わりません。また、configやcredentialsの改行コードがCRLFでもWSL2で問題ありませんし、LFでもWindowsで問題ありません。 ということはどちらの環境でAWS認証しても再利用できるということです。

これを利用して、WSL2かWindowsで一度認証を取ったら両方で利用できるようにします。

構成

Windowsに大本の.aws/フォルダとcredentialsconfigファイルを配置し、WSL2 UbuntuからWindowsの同フォルダをシンボリックリンクで参照します。Windowsにファイルを配置しているのは、WSLは簡単にすてられるため大本の設定を置きにくい一方、それに比べるとWindows環境は保持されるためです。1

Mermaid定義

graph TD
    A[Windows]
    B[WSL2 Ubuntu]
    C([%USERPROFILE%/.aws/])
    D([$HOME/.aws/])
    A ---> C
    B --> D -.シンボリックリンク.->C

構成の概要

Ansibleで構成と自動化

WSL2 Ubuntuは/mnt経由でWindowsのフォルダを直接参照できます。これを利用して、Ansibleでシンボリックリンクを作成します。

Ansible処理は次のようにします。

# ../include_role/ubuntu/credentials_aws.yaml
- name: ".aws - check src Win path {{ args.win_path }} exists"
  ansible.builtin.stat:
    path: "{{ args.win_path }}"
  register: win_aws_stat_result

- name: ".aws - check Linux path {{ args.linux_path }} is link"
  ansible.builtin.stat:
    path: "{{ ansible_home }}/{{ args.linux_path }}"
  register: linux_aws_link

- name: ".aws - delete linux default folder"
  ansible.builtin.file:
    path: "{{ ansible_home }}/{{ args.linux_path }}"
    state: absent
  when: (win_aws_stat_result.stat.exists) and (linux_aws_link.stat.exists) and (not linux_aws_link.stat.islnk)

- name: ".aws - create symlinks with Win path"
  ansible.builtin.file:
    src: "{{ args.win_path }}"
    dest: "{{ ansible_home }}/{{ args.linux_path }}"
    state: link
  when: win_aws_stat_result.stat.exists

変数を定義しておきます。

# roles/aws/vars/main.yaml
aws_config:
  - linux_path: .aws
    win_path: "/mnt/c/Users/{{ ansible_user_id }}/.aws"

あとは、処理を呼び出せばOKです。

# roles/aws/tasks/main.yaml
- name: "Link .aws credential"
  ansible.builtin.include_tasks: ../include_role/ubuntu/credentials_aws.yaml
  with_items: "{{ aws_config }}"
  loop_control:
    loop_var: args

自動化するにあたり、いろいろな環境で使えるように1つだけお約束を設けています。

  • WindowsとWSL2 Ubuntuのユーザー名は同じにする

もしユーザー名を決め打つなら適当に書き換えてください。

シンボリックリンクの対象で制御を分ける

今回は.awsフォルダをシンボリックリンクしましたが、AWS CLIの認証情報である~/.aws/config~/.aws/credentialsの2つだけシンボリックリンクにすることで、AWS SSOを利用している場合Windows/WSL2 Ubuntuの認証情報で認証セッションを分けることもできます。AWS SSOだけ挙動が変わるのは、認証トークンはsso_start_urlに基づいたファイル名を使用して、~/.aws/sso/cacheディレクトリの下のディスクにキャッシュされるためです。

シンボリックリンク対象 認証共有状況(IAM User) 認証共有(SSO)
~/.aws/ 認証情報を共有 認証情報を共有
~/.aws/config
~/.aws/credentials
認証情報を共有 個別に認証が必要

この辺りは、AWS CLIのドキュメントを参照してください。

まとめ

WindowsとWSL2 Ubuntuを併用していて、両方で同じようなコマンドを実行する人も多いでしょう。ちょっとした工夫で、AWS CLIの認証情報を手抜きしつつ二重管理せずに済むので割とオススメです。数年やってるのですが、IAM User/AWS SSOに関わらず意識せず使えるのはよいことです。

以前は~/.aws/config~/.aws/credentialsを個別にシンボリックリンクしていたのですが、.aws/フォルダ全体をシンボリックリンクにしたらSSOでも平気になったので最高でした。なんで気づかなかったんだろう。

参考


  1. 設定のバックアップはパスワードマネージャーで管理するといいでしょう