[小ネタ] コンテナへAWS CLI v2をインストールする時にチョッとハマったこと

Dockerコンテナ上のAmazon Linux2に対してAWS CLI v2をインストールした際に、チョットだけハマった点がありましたので紹介します。
2020.03.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

みなさん、こんにちは!
AWS事業本部の青柳@福岡オフィスです。

DockerやKubernetes (EKS) で検証を行う際に、コンテナ内でAWS CLIを使いたい場面がありました。
先月リリースされた AWS CLI v2 では別途Pythonやpipのインストールが不要になりましたので、こちらをコンテナにインストールしてみることにしました。

インストール自体は簡単に行えましたが・・・

今回は、ベースとなるコンテナイメージとしてAmazon Linux 2を使用しました。

Amazon Linux 2のDockerイメージを使ってコンテナを起動して、ログインします。

docker container run -it --rm amazonlinux:2 /bin/sh

AWSドキュメントの手順に従って、AWS CLI v2をインストールします。

Linux での AWS CLI バージョン 2 のインストール - AWS Command Line Interface

インストールする前に、Amazon Linux 2のDockerイメージには unzip がインストールされていないため、先にインストールしておきます。

# yum install -y unzip

手順に従ってAWS CLI v2のアーカイブをダウンロードした後に解凍して、インストーラーを実行します。

# curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
# unzip awscliv2.zip
# ./aws/install

インストールされたことを確認します。

# aws --version
aws-cli/2.0.5 Python/3.7.3 Linux/4.14.146-120.181.amzn2.x86_64 botocore/2.0.0dev9

アクセスキー等を設定します。

# aws configure
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]:

何かコマンドを実行してみます。

# aws s3 ls
2020-03-03 01:59:50 demo-bucket-2020XXXX
2019-10-22 06:23:50 test-bucket-2019XXXX
・・・

上手く実行できたようですね。
別のコマンドを実行してみます。

# aws ec2 describe-instances

[Errno 2] No such file or directory: 'less': 'less'

あれ?
何かエラーが出ました。

なんでエラーになるんだろう・・・? と少し悩みましたが、こちらのブログ記事を見て分かりました。

AWS CLI v2 でページ分割(less)を無効化できることを最近知った件 | Developers.IO

AWS CLI v2では、サブコマンドによってはページャー (ページ分割) が有効になっていて、デフォルトのページャーとして less が使われるようになっているんですね。

そして、Amazon Linux 2のDockerイメージはデフォルトでは less がインストールされていないため、エラーになったという訳です。

「"less" というファイルもディレクトリも無い」と言われたので何のことやら、と思ったのですが、まさか less コマンドのこととは・・・

解決方法

丸毛のブログ記事のように、コンフィグや環境変数で less を使わないようにするという方法もありますが、ここはズバリ「less をインストールする」方法で解決することにします。

最初に unzip をインストールしているところで、less もインストールしてしまうのが良いでしょう。

# yum install -y unzip less

これでエラーが出なくなります。

# aws ec2 describe-instances
{
    "Reservations": [
        {
            "Groups": [],
            "Instances": [
                {
・・・

(おまけ) Dockerfileを使ってDockerイメージを作成する場合

このような感じのDockerfileを記述しました:

Dockerfile

FROM amazonlinux:2
WORKDIR /tmp
RUN yum install -y unzip less && \
    curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
    unzip awscliv2.zip && \
    ./aws/install
WORKDIR /root

Dockerイメージをビルド:

$ docker image build -t al2-awscliv2 .

イメージからコンテナを起動してログイン:

$ docker container run -it --rm al2-awscliv2 /bin/sh

これで、コンテナ内でAWS CLI v2が使えるようになりました。

(コンテナを使う際には、IAMロール等で適切なアクセス権限を付与しておいてくださいね)

おわりに

コンテナの検証などで本記事がお役に立てれば何よりです。