Run AWS CLI in an Org buffer

Table of Contents

はじめに

  • org-babel で 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が実行できます orgaws-1.png

前準備

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への絶対パス) とします。 認証情報「tmp_cred.json」 を 2. 認証情報の取得 で生成します。

2. 認証情報の取得

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

#+BEGIN_SRC sh :var 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
#+END_SRC

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

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

cat ~/.aws/tmp_cred.json
{
  "AccessKeyId": "ASIXXXXXXXXXXXX",
  "SecretAccessKey": "L3iXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "SessionToken": "FQoXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,
  "Expiration": "2019-08-16T09:27:22Z",
  "Version": 1
}

3. aws コマンド実行

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

#+BEGIN_SRC sh :exports none
aws --profile mfa s3 ls
#+END_SRC

#+RESULTS[7743dee24d959553496de2c16c5341b64714847f]:
: 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

さいごに

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

▼Orgファイルの HTML export

参考

Author: kawahara.masahiro

Created: 2019-08-19 Mon 16:33

Validate