【Org-mode】Org文書内で AWS CLIを実行する #Emacs

Emacs Org-mode文書内で AWS CLIを実行します。 1. AWS CLIをインストール 2. exec-path-from-shell を使用 3. init.el編集 4. Org Babel で AWS CLI実行
2019.08.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Org-mode は Emacs のメジャーモードの 1つです。

Org-mode は、ノートの保存、TODOリストの管理、プロジェクト計画、文書編集のためのモードです。 高速で効率的なプレーンテキストのシステムを使ってファイルを編集します。

アウトライナーとしての利用はもちろん、TODOタスク管理ツールとしても使えます。 表計算や 別形式へのエクスポート (Markdown, HTML, PDF) なども可能です。 また、Org文書内で シェルや Pythonといったプログラムの実行も可能です。 プログラムとドキュメントを 1つの Org文書に記述する 文芸的プログラミング にも対応しています。

▲もちろんこの記事も Org文書で作成しています

そんな 何でもできる Org-mode ですが、 今回は コード実行機能(Org Babel)を使って Org文書内で AWS CLIを実行してみます。

実行環境

  • OS: macOS Mojave, version 10.14.5
  • Emacs: version 26.2
  • Org-mode: version 9.1.9

要約

1 AWS CLIをインストールします。

2 exec-path-from-shell を使って シェルのPATHを Emacsに引き継ぎます

3 Emacs の init.el に下記追加します

;;;; exec-path-from-shell
(when (memq window-system '(mac ns x))
  (exec-path-from-shell-initialize))

;;;; org-babel
;; コード実行時に confirm しない
(setq org-confirm-babel-evaluate nil)

;; 実行できる言語を指定
(org-babel-do-load-languages
 'org-babel-load-languages
 '(
   (shell . t)
   )
 )

4 AWS CLIが実行できます

前準備

AWS CLI

AWS CLIを こちら からインストールします。AWS CLI の初期設定手順は省略します。

Emacs: AWS CLI パス設定

aws コマンドを認識させるために Emacsの PATH設定を行います。 exec-path-from-shell を使って シェルのPATHを Emacsに引き継ぎます。

Installation どおりに exec-path-from-shell インストールを行います。

Installable packages are available via MELPA: do M-x package-install RET exec-path-from-shell RET.

インストール後、 init.el に下記設定を記載します。

(when (memq window-system '(mac ns x))
  (exec-path-from-shell-initialize))

Emacs: org-babel 設定

以下のように init.el に設定します。

;; コード実行時に confirm しない
(setq org-confirm-babel-evaluate nil)

;; 実行できる言語を指定
(org-babel-do-load-languages
 'org-babel-load-languages
 '(
   (shell . t)
   )
 )

AWS CLI実行

▼bashコマンドを実行してみます

コードブロック内( #+BEGIN_SRC ... #+END_SRC )で C-c C-c ( org-babel-execute-src-block ) を実行します。 記述したコードが評価され、結果が #+RESULTS 直下に表示されます。

#+BEGIN_SRC sh
ls
#+END_SRC

#+RESULTS[789f649c27406e24e1fb6689fcf186a331f138b6]:
: img
: index.html
: init.el
: run-awscli.org

aws コマンドのパスが通っているか確認します

#+BEGIN_SRC sh
aws --version
#+END_SRC

#+RESULTS[94050750f89caff84a83600af87f81985908ce7e]:
: aws-cli/1.16.173 Python/3.7.3 Darwin/18.7.0 botocore/1.12.163

aws コマンドを実行してみます

aws s3 ls でバケット一覧を表示してみます。

#+BEGIN_SRC sh :exports both
aws s3 ls
#+END_SRC

#+RESULTS[5681767c5c45395a7ae378fac0a022d23ad41199]:
: 2019-08-05 16:36:39 aws-athena-query-results-xxxxx-ap-northeast-1
: 2019-07-08 18:43:57 cf-templates-xxxxx-ap-northeast-1
: 2019-05-20 10:04:01 cm-members-xxxxx

※MFA設定への対応

MFAを設定している場合は少々プロセスが煩雑になります。 以下、 MFA設定有り かつ スイッチロール有り のケースの対応です。

  1. 設定ファイルの編集

    ~/.aws/config ファイルを以下のように記述します。

        [profile mfa]
        output = json
        region = ap-northeast-1
        credential_process = cat /Users/kawahara.masahiro/.aws/tmp_cred.json

    最後の行は credential_process = cat (tmp_cred.jsonへの絶対パス) とします。 認証情報「tmpcred.json」 を以降で生成します。

  2. 認証情報の取得

    aws sts assume-role で一時的な認証情報を取得します。 以下スクリプトを実行します。

        MFA='240030'
        MFA_ARN='arn:aws:iam::xxxxx:mfa/cm-kawahara.masahiro'
        ROLE_ARN='arn:aws:iam::yyyyy:role/cm-kawahara.masahiro'
        
        aws --output json \
          sts assume-role \
          --role-arn "$ROLE_ARN" \
          --role-session-name ar-cred-proc \
          --serial-number "$MFA_ARN" \
          --token-code $MFA \
        | jq ".Credentials + {Version: 1}" > ~/.aws/tmp_cred.json

    今回は Org buffer 上で shellを実行してみます。 下記の :var MFA=xxxxxx 部分に MFAの認証コードを記入して実行(C-c C-c )します。

    (確認) tmpcred.json を表示します。

  3. aws コマンド実行

    以降、 "Expiration" に記載されている時刻まで AWSコマンドを実行できます。

さいごに

今回使用したOrgファイル他を下記に置いています。

▼Orgファイルの HTML export

参考