こんにちはエンジニアの 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