EmacsからAmazon S3へ読み書きできるs3edを使ってみた

EmacsからAmazon S3上のファイル(オブジェクト)を読み書きできるs3edというパッケージについて、インストール方法と簡単な使用方法などをまとめてみました。プロファイルを用いてAWS環境を切り替えられたりと、いい感じに使えるパッケージだと思います!
2020.08.31

はじめに

清水です。十数年ほど愛用しているEmacs *1でAmazon S3 *2上のオブジェクト(ファイル)を扱いたくなりました。調べてみると、s3edというEmacsからS3上のオブジェクトを操作するためのパッケージが公開されています。使ってみたところ、けっこういい感じです!本エントリでは、このs3edについてインストール方法や使用上のポイントなどをまとめてみます。

Emacsの環境

今回のエントリで試してみた環境は以下になります。

s3edを使用する準備

s3edのインストール

まずはs3edをEmacsにインストールします。GitHubのREADME.mdに記載がある通り、MELPAリポジトリが有効になっていれば以下コマンドでインストールが可能です。

M-x package-install s3ed

私の環境ではMELPAリポジトリが有効になっていなかったので *4、この設定を合わせて行いました。具体的にはMELPAリポジトリを有効にするため、.emacsに以下を追記、設定反映後にM-x package-install s3edを行いました。

(require 'package)
(add-to-list 'package-archives
             '("MELPA" . "https://melpa.org/packages/") t)
(package-initialize)

.emacsへの記載

まずはs3ed使用にあたり、GitHubのREADME.mdに記載がある以下4行を.emacsに追記しておきました。

(require 's3ed)
(s3ed-mode)
(global-set-key (kbd "C-c s f") 's3ed-find-file)
(global-set-key (kbd "C-c s s") 's3ed-save-file)

なお、s3ed-mode自体はデフォルトでoffにしておくこともでき、またキーバインディングについてはs3ed-find-files3ed-save-fileコマンド自体で利用もできます。そのため最終的に私は(require 's3ed)のみを.emacsに記載、必要に応じてM-x s3ed-modeすることにしました。

AWS環境へのアクセス準備

s3edではAWS環境(Amazon S3)にアクセスしますが、内部的にはAWS CLI(AWSコマンドラインインターフェイス)をしているとのことです。そのため事前にAWS CLIのインストールならびに認証情報の設定を実施しておきます。認証情報は通常のAWS CLI使用時と変わらず~/.aws/credentials(と必要に応じて~/.aws/config)を使用します。

IAMユーザを用意し、必要な権限をアタッチしておきます。権限は最大でもAmazonS3FullAccess、必要に応じて特定のバケットにのみアクセスを可能にするなど権限を絞っておきます。アクセスキーを発行して、~/.aws/credentialsに設定しておきます。

% cat ~/.aws/credentials
[default]
aws_access_key_id = AKXXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

なお、~/.aws/configファイルは以下のようになっています。

output = json
region = ap-northeast-1

AWS CLI実行環境へのパスの追加

AWS CLI使用について、認証情報の準備と合わせてEmacsからawsコマンドが参照できる(パスが通っている)必要があります。

awsコマンドが/usr/local/bin/awsにある場合は下記のような内容を.emacsに追記してパスを通しておきます。

(setq exec-path (append exec-path '("/usr/local/bin")))
(setenv "PATH" (concat (getenv "PATH") ":/usr/local/bin"))

pyenvを使ってPython環境を構築、awsコマンドが~/.pyenv配下にあるような場合は以下のような内容を.emacsに追記します。(こちらは実際には、上記/usr/local/bin/awsをPATHに追加した後で、さらにパスを追加するかたちですが、適宜読み替えてください。)

(add-to-list 'exec-path "/Users/[ユーザ名]/.pyenv/shims/")

s3edを使ってみる

それでは実際にs3edを使ってEmacsからS3上のファイル(オブジェクト)を開いてみます。C-c s fまたはM-x s3ed-find-fileを実行します。ミニバッファにFinde S3 file: s3://と表示されるので、開きたいファイルがあるS3バケットを入力しRET

TABでのパス補完も有効です!続いて開きたいファイルへのパス(オブジェクトキー)を入力し、RETでファイルを開きます。今回はs3://s3ed-test-XXXXXXXXXX/s3ed-an-interface-to-s3-from-emacs.mdというファイルを開いていみます。

ファイルを開いた後は以下のようになります。タイトルバーにフルパスを表示するように設定しているのですが、が表示されているの/tmp/s3ed/default/[S3バケット名]/[オブジェクトキー]となっているのが確認できます。GitHubのREADME.mdにも記載がありますが、s3edではS3からファイルをローカルにダウンロードして扱います。スクラッチスペースとしては/tmp/s3ed/が使用されるとのことです。

ファイルの更新についても確認してみましょう。いつものようにC-x C-sで保存してみます。ミニバッファにs3ed: Transferring data to s3...と表示され、S3にファイルが転送、保存されます。

実際にS3上のオブジェクトが更新されたか確認してみましょう。ターミナルからs3 cpコマンドでS3上のオブジェクトを取得してみました。

しっかり保存されていますね!

その他のファイルも開いてみましょう、例としてS3上に保存してあるCloudTrailログを開いてみようと思います。C-c s fまたはM-x s3ed-find-fileからCloudTrailログ保存用のバケットを指定します。この際、バケット名の末尾の/を削除してRETすることでファイラdiredでディレクトリを開いている状態となります。

ここからCloudTrailログファイルを開きましょう。S3上のオブジェクトは.gzで圧縮されていますが、そのまま開くことができます。

このほか、s3ed-save-fileでバッファをS3に別名で保存することもできるようです。

プロファイルを利用したAWS環境の切り替え

続いて、s3ed使用時のAWSプロファイルについても確認しておきます。AWS CLIをコマンドラインで通常使う際、--profileオプションで複数の認証情報を切り替えて利用できるように、s3edでもプロファイルを利用した認証情報の切り替えが可能です。(ただし、使用時にMFAを要求する場合は難しいようです。)具体的に確認してみましょう。以下の~/.aws/credentialsファイル、~/.aws/configファイルをそれぞれ準備しました。defaultについては先ほどと同様、profile-aを追加したかたちです。

% cat ~/.aws/credentials
[default]
aws_access_key_id = AKXXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

[profile-a]
aws_access_key_id = AKYYYYYYYYYYYYYYYYYYYY
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
% cat ~/.aws/config
[default]
output = json
region = ap-northeast-1

[profile profile-a]
output = json
region = ap-northeast-1
source_profile = profile-a

使い方は2通りあります。まずはEmacsの環境変数s3ed-profile-nameとして.emacsに設定する方法です。具体的には以下の内容を追記します。

(setq s3ed-profile-name "profile-a")

その後、C-c s fまたはM-x s3ed-find-fileでS3上のファイルを開きます。開いた際、 タイトルバーに表示されるフルパス部分でパスが/tmp/s3ed/[プロファイル名]/[S3バケット名]/[オブジェクトキー]となるように、ローカルの/tmp/s3ed/内でも別ディレクトリが使用されるようです。

もう一つの方法は、M-x s3ed-set-profileコマンドを使用します。ミニバッファでS3ed Profile:と聞かれるので、使用するプロファイル名を入力します。

その後、C-c s fまたはM-x s3ed-find-fileでS3上のファイル(オブジェクト)を開く、という流れになります。

まとめ

愛用しているEmacsからAmazon S3上のファイル(オブジェクト)を読み書きできるs3edとういパッケージについて、インストール方法と簡単な使用方法をまとめてみました。単純にS3上のファイルの読み書きができることも嬉しいのですが、個人的にはプロファイル対応している点もポイントです!なお、あくまで一度ローカル環境にダウンロードしている点は留意しておきましょう。複数環境からS3に読み書きがある場合などでは、S3上の最新の変更が反映されていないままS3に保存をしてしまう、など発生する可能性があります。

Emacsからリモートのファイルを操作するにはTRAMPが有名だと思います。 *5そして本パッケージの作者の方もこの点は認識されているようで、TARMPへの統合も考えているようです *6、こちらも楽しみですね!また個人的には数年来、S3に置いてあるファイルをローカルにダウンロードして編集、再度アップロードということをしていましたが、これで作業がだいぶ捗るかと思いました。そんなわけで今後もEmacsとは離れられそうにありません。Happy Hacking with Emacs!

脚注

  1. 出会いは2002年4月、XEmacs on Turbolinux 6.0でした。その後Meadow(1.1系から2系を飛ばして3系へ)、GNU Emacs for Windows(オフィシャルビルド)を経て、現在はEmacs for OSXを愛用しています。またここ5年ほどはOrg-modeが欠かせない存在になっています。
  2. S3との出会いは2012年。こちらももう少しで10年ほどの付き合いになりますね。長い付き合いなのですが、S3のことをどこまで理解できているかはわかりません。
  3. ざっと確認したところ、GNU Emacs 27.1(GNU Emacs For Mac OS X)でも問題なさそうです。
  4. MELPA Stableリポジトリは有効になっていました。これは以前のエントリで使ったときに設定したものと思われます。
  5. 実は私はTRAMPを使ったことがないのですが……。
  6. https://github.com/mattusifer/s3ed/issues/22