今回はかなりピンポイントな話しですが、Dockerで起動したLocalStackにMac用のS3クライアントであるCyberduckで接続する方法です。
ネットで探したけど、見当たらなくて、ちょっと苦労したので、誰か一人でもお役に立てればと。
LocalStackとは?
LocalStackとは、AWSのいろんなサービスを開発するのに、ローカル環境やCI環境などで、仮想AWSとして動作してくれる、テスト/モックフレームワークです。モックとはいえ、例えばS3だったら、ちゃんとバケット作成できて、アップロードやダウンロードできます。
無料で使えるサービスと、有料のProでしか使えないサービスがありますが、無料でもかなりいろいろ使えます。詳しくは公式サイトを。
今回はS3だけに限った話しです。
LocalStackのGUI非推奨問題
LocalStackには、WEB DashboardというGUIがあって、S3の操作もそこでできたっぽかったのですが、今はdeprecated(非推奨)になってで、デフォルトでOFFになってます。
また、GUIを使うには、標準ではないDockerイメージ(localstack/localstack-full)を使う必要があって、なんか大きそうでいやです。イメージですが。イメージだけに。
というわけで、将来なくなりそうなので、WEB Dashboardは使いません。
S3クライアントでつなげたい
そうはいっても、ファイルのアップロードとか、ざっくりファイルの一覧見たりするときに、GUIは使いたいです。
AWS CLIで、
aws --endpoint-url=http://localhost:4566 s3 ls
とかたたいて、順番に降りていけば、問題なく見えるのですが、そりゃめんどくさいです。
もう死ぬほどいやです。
そこで、MacのS3クライアントといえば、おなじみのCyberduckですが、そのままではつながりません。
その接続方法です。
CyberduckでのLocalStack(S3)への接続方法
まずは、LocalStackへHTTPSではなく、HTTPで接続するために、このページにいって、
Authentication with signature version AWS4-HMAC-SHA256
Download S3 (HTTP) connection profile for preconfigured settings
っていうプロファイルをダウンロードして、インストールしましょう。ダウンロードしたファイルをダブルクリックでいけるはずです。
このプロファイルを入れずに、そのまま接続しようと思っても、いけなくはないですが、オレオレ証明書エラーがでて、いろいろいやなので、HTTPのほうがよいです。
これで、サーバーをlocalhost
、ポートを4566
(古いLocalStackの場合は適宜変更)して、適当なアクセスキーIDとシークレットアクセスキーを入れると(入力なしだとエラーになってしまうので)、一応つながって、バケットやファイルの一覧が見えます。
なんだ簡単じゃないの!
っと思ったのもつかの間、ファイルのダウンロード、アップロードをしようとすると、
バケット名.localhost. DNSは、インターネットアドレスをサーバー名に変換するネットワークサービスです。このエラーはほとんどの場合、誤ったネットワーク設定やネットワークへの接続を有していないことが原因です。また、無反応なDNSサーバーやネットワークへのアクセスを防ぐファイアウォールによって引き起こされます。
とかでエラーが出てしまいます。
うーむ、バケット名をサブドメインにつける、virtual-hosted style
でつなげにいってしまってますね。
実際のS3では廃止予定ですが、path-style
でつなげにいってほしいのですが、そんなオプションやプロファイルはなさそうです。
ここでしばらく悩みました。
対応方法はIPアドレスにするだけ。ただそれだけ
ひょっとしたらlocalhostではなく、IP(127.0.0.1)にしたら、それにサブドメインをつけることって、しないんじゃない?って思ったら、あっさりうまくいきました。
こんな感じ。
簡単ですね。これで、嘘のようにうまく動くようになります。 アクセスキーIDとシークレットアクセスキーは、ダミーなのでキーチェーンに保存したくなかったですが、保存しないと毎回聞かれてうざいので、dummyを保存しました。
awslocalコマンドインストールしたくない問題
localstackは、AWS CLIに対応しているので、上にも記載しまいたが、endpointを指定すれば、公式のAWS CLIで接続できます。
こんな感じ。
aws --endpoint-url=http://localhost:4566 aws ls
でも毎回打つのめんどくさいですよね。そんな人のために、awslocalというコマンドがあって、localstackのコンテナには最初からインストールされているのですが、別途このコマンドだけpip install awscli-local
でインストールできるみたいなので、入れたのですが、一緒にV1系のAWS CLIまでインストールされてしまったので、急いで削除しました。
こっちはV2使ってるのに!
でも、単に以下のalias作るだけでいいことに気づいた。
alias awslocal='aws --endpoint-url=http://localhost:4566'
これに気づいたときは、オレ天才かよ!って思った。それだけ。
では。
コメント