ITインフラエンジニアのおつむの整理

ITインフラエンジニア(現ニート)の頭の整理場所。ほぼ日記になる予定。

WSLでAWS CLIのDockerイメージを使用できるようにするまで

はじめに

最近Surface Go 3を買ったのですが、なるべくソフトをインストールすることなく使用したいと考えていました。そんな中ふと思いつきでAWS CLIを使用したいと思い、また最近Dockerを勉強していたこともありWSLでdockerを使用することで今後CLIやプログラミングをdockerで環境用意すればよくね?と思い付きで試して思ったより時間がかかったので書き残します。 (すぐ終わるだろうと高を括っていたのでログをとっておらず、Qiitaとかに乗せるにはひどいのでブログ側に書いておきます)

環境

WSLインストール

  1. Windowsターミナル起動
  2. WSLインストール powershell wsl --list --online #インストール可能なディストリビューション確認 wsl --install #ディストリビューション指定なしでUbuntuをインストール
  3. インストール完了後再起動
  4. WindowsターミナルからUbuntuを選択してWSL起動 image.png
  5. 初期ユーザ/パスワード設定(sudo可能なユーザ)
  6. 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らしいです。

docs.aws.amazon.com

イメージをプルして

$ 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はちゃんとシャットダウンする癖をつけたほうが良いかもしれませんね。