WSLでAWS CLIのDockerイメージを使用できるようにするまで
はじめに
最近Surface Go 3を買ったのですが、なるべくソフトをインストールすることなく使用したいと考えていました。そんな中ふと思いつきでAWS CLIを使用したいと思い、また最近Dockerを勉強していたこともありWSLでdockerを使用することで今後CLIやプログラミングをdockerで環境用意すればよくね?と思い付きで試して思ったより時間がかかったので書き残します。 (すぐ終わるだろうと高を括っていたのでログをとっておらず、Qiitaとかに乗せるにはひどいのでブログ側に書いておきます)
環境
WSLインストール
- Windowsターミナル起動
- WSLインストール
powershell wsl --list --online #インストール可能なディストリビューション確認 wsl --install #ディストリビューション指定なしでUbuntuをインストール
- インストール完了後再起動
- WindowsターミナルからUbuntuを選択してWSL起動
- 初期ユーザ/パスワード設定(sudo可能なユーザ)
- Windowsターミナルから
wsl
コマンドでWSLが起動するようになる(初期ユーザ作成前にwsl
を入力しても起動しなかったです)
バージョンは以下でした
$ cat /etc/os-release PRETTY_NAME="Ubuntu 22.04.1 LTS" NAME="Ubuntu" VERSION_ID="22.04" VERSION="22.04.1 LTS (Jammy Jellyfish)" VERSION_CODENAME=jammy ID=ubuntu ID_LIKE=debian HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" UBUNTU_CODENAME=jammy
Dockerインストール・サービス起動
インストール
ここが少し引っかかったポイントです。DockerのインストールはRed Hat系では何度も試していたのですが、UbuntuなどのDebian系は初めてだったので少し勝手が違い戸惑いました。
最初は以下のサイトを参考にリポジトリ追加とGPG公開鍵追加(Red Hat系では実施したことがなかった記憶)を実施して、apt update
を実行しました。
https://sid-fm.com/support/vm/guide/install-docker-ubuntu.html
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - $ sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable" #ここで/etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.listができます $ apt update
するとupdateのところでエラー、また試しにdockerのインストールを試しても失敗。 同件事象を調べたらいくつか引っかかり、どうやらapt-keyが非推奨(廃止予定)とのことで。 以下先人の情報を参考にさせてもらいました。 https://text.baldanders.info/remark/2022/05/apt-key-is-deprecated/
まずは公開鍵を配置。
$ cd /etc/apt/keyrings $ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o docker-key.asc
その後/etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list
の中身を手動で修正。(signed
の部分を追記)
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker-key.asc] https://download.docker.com/linux/ubuntu jammy stable
上記実施後apt update
が成功するようになったため、以下コマンドでDocker関連パッケージをインストール。
sudo apt install docker-ce docker-ce-cli containerd.io
サービス起動
インストールできたため、いざサービスを起動して実行しようとしたらなぜかsystemctlが実施不可。
$ systemctl status docker System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down
エラーに表示されている通りでしたが、どうやらsystemdがPID1で起動していないためsystemctlコマンドが使用できないっぽいです。 ではPID1は何になっているのかいうと、initになっているようです。そのためinit.dからサービスを起動を試したら無事Dockerサービスが起動し、dockerコマンドが実行できるようになりました。
$ /etc/init.d/docker start
DockerでAWS CLIの実行
無事Dockerが使用できるようになりましたので、あとはコンテナイメージを持ってくればどうにかなりますね。
公式のイメージはamazon/aws-cli
らしいです。
イメージをプルして
$ sudo docker pull amazon/aws-cli
公式のコマンドを参考に実行してみれば
$ sudo docker run --rm -it amazon/aws-cli --version aws-cli/2.8.8 Python/3.9.11 Linux/5.15.68.1-microsoft-standard-WSL2 docker/x86_64.amzn.2 prompt/off
実行できましたね!あとはAWS CLI実行用にアクセスキーを発行、リージョン情報やアクセスキーの設定です。
AWS CLI実行用クレデンシャル設定
使用するリージョン、アクセスキーを~/.aws
を用意してそこに格納します。
アクセスキーが必要なので、AMCで事前にCLI実行用のIAMユーザを作成します(アクセスキーが漏れても怖いのでいったん権限はreadonlyだけにしておきます)
$ mkdir ~/.aws $ cat <<EOF > ~/.aws/config > [default] > output = json > region = ap-northeast-1 > EOF $ cat <<EOF > ~/.aws/credentials > [default] > aws_access_key_id = xxxxxxxxxx > aws_secret_access_key = xxxxxxxxxx > EOF
クレデンシャル情報をマウントしてAWS CLI実行
そして最後に上記で用意したフォルダを、dockerコマンド実行時にマウントして実行するようにすれば
$ sudo docker run --rm -it -v ~/.aws:/root/.aws amazon/aws-cli iam list-account-aliases { "AccountAliases": [ "xxxxxxxxxxxxxx" ] }
実行できるようになりました!とりあえず実行できてよかった。コマンドが長いので、エイリアス設定とかするのがよさそうですね。 一つ気がかりなのは、毎回コンテナを作成しているのでaws cliを実行する際にtabでコマンドの補完がされないんですよね。使用したいときにコンテナをbashとかで起動しっぱなしにしてコンテナにアクセスして使用する方法が個人的にはあっている気がします。それはまたいずれということで。
dockerコマンドでsudoめんどい
毎回sudoしていたので、sudo不要で実行できるようにします。dockerのグループが作成されているようなので、そこに現在の自分のユーザを追加します。
$ groups horonium horonium : horonium adm dialout cdrom floppy sudo audio dip video plugdev netdev $ sudo usermod -aG docker horonium $ groups horonium horonium : horonium adm dialout cdrom floppy sudo audio dip video plugdev netdev docker
その後dockerを再起動したのですが、それだけではだめのようでしたのでいったんwsl --shutdown
でWSLを再起動。
$ sudo /etc/init.d/docker restart * Stopping Docker: docker [ OK ] * Starting Docker: docker [ OK ] horonium@TABLET-19B4QHAB:~/.aws$ docker ps Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied
無事sudo無しでも実行できるように。
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE amazon/aws-cli latest c50e434a6ee3 40 hours ago 367MB
PCスリープして数時間後apt updateでエラーが
なにやらエラーが出るようになりました。
$ sudo apt update Hit:1 https://download.docker.com/linux/ubuntu jammy InRelease Hit:2 http://archive.ubuntu.com/ubuntu jammy InRelease Get:3 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB] Get:4 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [114 kB] Get:5 http://archive.ubuntu.com/ubuntu jammy-backports InRelease [99.8 kB] Reading package lists... Done E: Release file for http://security.ubuntu.com/ubuntu/dists/jammy-security/InRelease is not valid yet (invalid for another 1h 14min 20s). Updates for this repository will not be applied. E: Release file for http://archive.ubuntu.com/ubuntu/dists/jammy-updates/InRelease is not valid yet (invalid for another 1h 14min 39s). Updates for this repository will not be applied. E: Release file for http://archive.ubuntu.com/ubuntu/dists/jammy-backports/InRelease is not valid yet (invalid for another 1h 15min 12s). Updates for this repository will not be applied.
以下先人がいらっしゃいまして、どうやらWSLのマシンをスリープするとWSLの時間がずれてしまうことが影響とのこと。自分も2時間くらいずれてました。 https://ginpen.com/2021/06/05/apt-update-release-file-is-not-valid-yet/
参考先にあったようにwsl --shutdown
で改めてWSLを起動しなおしたら正常になりました。WSLはちゃんとシャットダウンする癖をつけたほうが良いかもしれませんね。