プレスリリースやお知らせ、開発ブログ、会社の活動状況、Mattermost・aws・AI等の技術情報などを発信しています。

[小ネタ][Mac]インストールなしでAWS CLI v1とv2の両方を使う

こんにちはエンジニアの sakasai です。

MotoGP が開幕しましたね。今年は 日本グランプリ を開催してくれると思うので今から楽しみです。

今週末には 全日本ロードレース も開幕するのでこちらも楽しみにしてます。

個人的には5月に開幕する World SBK が待ち遠しいです。


さて本題ですが、AWS CLIにはv1とv2の2つのバージョンがあります。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/welcome-versions.html

現行バージョンはv2で、新しくインストールして使う分にはv2を使うで問題ないと思いますが、バージョン間に下位互換性がないと言うことで、様々な理由でバージョンを使い分けたいとか、もともとv1が入ってるけどv2も使いたいとかとかがあると思います。

と言うわけで、両バージョンを使えるようにしてみようと思います。(インストールなしで)



TL;DR

  • docker使います

環境

  • PC
    • MacBook Pro (13-inch, M1, 2020)
    • macOS Big Sur 11.2.3
  • Docker
    • Docker version 20.10.5, build 55c4c88

AWS CLI バージョン 2

まずv2ですが、 dockerhubにある公式イメージのドキュメント に書いてある方法をそのまま使います。

最初にdockerコマンドをaliasに設定します(ドキュメントの中断あたりに書かれています)。

ホームディレクトリの .zshrc に以下を追加

vi ~/.zshrc


alias aws2='docker run --rm -ti -v ~/.aws:/root/.aws -v $(pwd):/aws amazon/aws-cli'

-v オプションで認証設定ディレクトリ( .aws )とカレントディレクトリをローカルとコンテナで共有します。

.zshrc を再読み込みしてaliasを有効にした後にコマンドを確認します。


% source ~/.zshrc
% aws2 --version
aws-cli/2.1.32 Python/3.8.8 Linux/4.19.121-linuxkit docker/aarch64.amzn.2 prompt/off

aws2コマンドが使えるようになりました。

認証設定を行い、実際にAWS環境につないでみます。


% aws2 configure
AWS Access Key ID [None]: **********
AWS Secret Access Key [None]: ********************
Default region name [None]: ap-northeast-1
Default output format [None]: json

% aws2 s3 ls
2020-12-23 06:57:52 xxxxxxxxxx
...

問題なくつながりました。


AWS CLI バージョン 1

つぎにv1ですが、dockerhubのイメージになさそうなので自前でイメージを作ります。

v2のDockerfile を参考にPythonのイメージをベースにして作ります。

vi Dockerfile

FROM python:3.9

RUN apt-get -y update
RUN pip install -U pip
RUN pip install -U awscli

WORKDIR /aws
ENTRYPOINT ["/usr/local/bin/aws"]

pythonのバージョンには特に意味はありませんが、 v1は3.6以上が必要 ということでとりあえず最新にしました。

ビルドしてイメージを作ります。


% docker build -t awscli:1.x .

正常終了したらイメージを確認します。


% docker images
REPOSITORY                                     TAG            IMAGE ID       CREATED        SIZE
awscli                                         1.x            39eae915defc   23 hours ago   942MB
...

aliasを設定する前にコマンドが使えるか確認してみます。


% docker run --rm -ti awscli:1.x --version
aws-cli/1.19.40 Python/3.9.2 Linux/4.19.121-linuxkit botocore/1.20.40

無事に使えることが確認できたので、v2と同じくaliasに設定します。

vi ~/.zshrc


alias aws1='docker run --rm -ti -v ~/.aws:/root/.aws -v $(pwd):/aws awscli:1.x'

また .zshrc を再読み込みしてaliasを有効にした後、コマンドを確認します。


% aws1 --version
aws-cli/1.19.40 Python/3.9.2 Linux/4.19.121-linuxkit botocore/1.20.40

問題なく使えることが確認できました。

認証設定はv2のものと共有されるので、AWSにつながるか確認します。


% aws1 s3 ls
2020-12-23 06:57:52 xxxxxxxxxx
...

無事につながりました


おまけ LocalStack

ローカルでアプリケーションを開発するときに、AWSリソースのモック環境として LocalStack を利用している方も多いと思います。

LocalStackのリソース確認する際にawsコマンドを利用することもあると思いますが、 --endpoint-url を書く必要があったりと面倒なので、こちらもaliasでコマンドを使えるようにしてみます。( 公式GithubのREADME にも書いてありますね)

※LocalStackについての細かい説明などは省略します。

まずコンテナ間でネットワークを共有する必要があるのでLocalStack用のdockerネットワークを作成します。


% docker network create localstack
% docker network ls
NETWORK ID     NAME             DRIVER    SCOPE
a316b9b28c5e   localstack       bridge    local

つぎにLocalStack用の docker-compose.yml を作成して、起動します。

vi docker-compose.yml


version: '2.1'

services:
  localstack:
    container_name: localstack
    image: localstack/localstack
    ports:
      - "4566:4566"

networks:
  default:
    external:
      name: "localstack"

% docker-compose up
Recreating localstack ... done
Attaching to localstack
localstack    | Waiting for all LocalStack services to be ready
...
localstack    | Ready.
...

LocalStackが起動したら、LocalStack用のawsコマンドをaliasに設定します。

vi ~/.zshrc


alias awslo='docker run --rm -ti --network localstack -v ~/.aws:/root/.aws -v $(pwd):/aws amazon/aws-cli --profile localstack --endpoint-url http://localstack:4566'

dockerコマンドの --network オプションにlocalstackを設定して、今回はAWS CLI v2を使いました(v1でも大丈夫なはずです)。

.zshrc を再読み込みして、コマンドの確認をします。


% source ~/.zshrc
% awslo --version
aws-cli/2.1.32 Python/3.8.8 Linux/4.19.121-linuxkit docker/aarch64.amzn.2 prompt/off

無事コマンドが使えたので、LocalStackにつながることを確認します。


% awslo s3 ls
% awslo s3 mb s3://localtest
make_bucket: localtest
% awslo s3 ls
2021-03-31 14:18:48 localtest
% touch xxx.txt
% awslo s3 cp xxx.txt s3://localtest/
upload: ./xxx.txt to s3://localtest/xxx.txt
% awslo s3 ls
2021-03-31 14:18:48 localtest
% awslo s3 ls s3://localtest/
2021-03-31 14:19:29          0 xxx.txt

無事に使えました。

いかがでしょうか、参考になれば幸いです。

今回作成した最終的なファイルなど、GitHubにアップしています。

https://github.com/msakasai/aws-cli-test


弊社ではエンジニア募集してます。

https://www.wantedly.com/companies/company_6372758/projects

気になった方はお気軽にご連絡ください。(カジュアル面談でちょっと話が聞きたいという方は自分のtwitter宛にDMをいただく形でも大丈夫です)

★ エンジニア間で情報交換をしませんか?
弊社では弊社社員以外の外部のエンジニアも含めて技術に関する情報交換&モチベーション向上等を目的としたチャットを提供しております。
是非、ご興味がありましたら是非参加して頂きお互いに切磋琢磨できればと思っています。

https://d-challenge.chat.d-make.co.jp/signup_user_complete/?id=kqy6hqpfq7frtnqpmyqaj4sm7h


  • B!

おすすめ記事リンク