Dockerで起動したLocalStackのS3にCyberduckで接続する

スポンサーリンク

今回はかなりピンポイントな話しですが、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'

これに気づいたときは、オレ天才かよ!って思った。それだけ。

では。

コメント

タイトルとURLをコピーしました