Docker 環境で Akamai CLI を試す

# Akamai CLI 
Akamai CLI を使用すると、コマンドラインから直接アカマイ製品の設定と管理が行えます。[Akamai CLI のインストール](https://qiita.com/kabe-akam/items/cb08ebc2ad03b6ff3c58) の記事を参考にして簡単にインストールできます。インストールがすでに成功している方はここで示した記事を見る必要はありません。この記事では macOS 環境での例となっていますで、Windows 環境では適時コマンドの Syntax を変更して解釈してください。

# Docker を使うメリット
Akamai CLI を利用するのに Docker は必須ではありません。しかし、利用すると次のような便利なこともあります。

1. インストールをスキップしてすぐに使いたい

2. 環境に依存したインストールの問題を回避したい
Akamai CLI はローカル環境でいくつかのツールに依存することがあります。Akamai が提供する Docker Development Environment (以後、Akamai Docker イメージ）を利用すれば、それらの依存性を回避し、すぐに Akamai CLI を利用することができます。
3. CI/CD パイプラインに組み込みたい
Docker を使えば、CI/CD パイプラインなどに組み込むことが容易になります。例えば、CircleCI のようなツールを使って、パイプライン上で Akamai EdgeWorkers CLI をクラウド上で動かすために Docker イメージを活用する、といったこともできます。

# Docker を使うデメリット
少なくとも Docker のプロセスをローカル環境（ホストOS）上で起動させる必要があります。Docker のプロセスは軽いとはいえ、コンピュータリソースを消費しています。また、Akamai Docker イメージはサードパーティのツールが含まれていないため、用途によっては更に追加のコードや他のコマンドを起動する必要があります。

# Akamai Docker イメージの準備
以下に公開されているページに、提供されるイメージのインストールと起動の方法が書かれています。

https://github.com/akamai/akamai-docker

akamai/shell をプルすれば、全てのコマンドが含まれていますので、こちらの利用をお勧めします。
```
docker pull akamai/shell
```

キャッシュのパージ目的だけであれば、akamai/purge をプルすれば良いです。
```
docker pull akamai/purge
```

# Akamai Docker イメージの利用
ローカル環境（ホストOSとして macOS を例にしています）で Docker イメージを起動します。
```
docker run --rm -it -v $HOME/.edgerc:/root/.edgerc:ro akamai/shell
```
起動が成功すると次のようなメッセージが表示されます。
```
                ___    __                         _            
               /   |  / /______ _____ ___  ____ _(_)           
              / /| | / //_/ __ `/ __ `__ \/ __ `/ /            
             / ___ |/ ,< / /_/ / / / / / / /_/ / /             
            /_/  |_/_/|_|\__,_/_/ /_/ /_/\__,_/_/              
===============================================================
=  Welcome to the Akamai Docker Image                         =
===============================================================
=  Project page:                                              =
=  https://github.com/akamai/akamai-docker                    =
===============================================================
```
Akamai CLI もインストールされています。
```
Akamai DevOps [~] >> akamai 
Usage: 
  akamai [global flags] command [command flags] [arguments...]

Built-In Commands:
  config
  help
  install (alias: get)
  list
  search
  uninstall
  update
  upgrade

Installed Commands:
  adaptive-acceleration (aliases: a2, adaptive-acceleration/adaptive-acceleration)
  api-gateway (alias: api-gateway/api-gateway)
  api-keys (alias: api-gateway/api-keys)
  api-security (alias: api-gateway/api-security)
  appsec (alias: appsec/appsec)
  cloudlets (aliases: cloudlets, cloudlets/cloudlets)
  cps (aliases: certs, cps/cps)
  dns (alias: dns/dns)
  eaa (alias: eaa/eaa)
  edgekv (aliases: ekv, edgekv, edgeworkers/edgekv)
  edgeworkers (aliases: ew, edgeworkers, edgeworkers/edgeworkers)
  etp (alias: etp/etp)
  firewall (aliases: fw, firewall/firewall)
  gtm (alias: gtm/gtm)
  image-manager (aliases: im, image-manager/image-manager)
  jsonnet (aliases: jsonnet, jsonnet/jsonnet)
  onboard (aliases: onboard, onboard/onboard)
  pipeline (aliases: pl, pd, proddeploy, property-manager/pipeline)
  property (alias: property/property)
  property-manager (aliases: pm, snippets, property-manager/property-manager)
  purge (alias: purge/purge)
  sandbox (alias: sandbox/sandbox)
  site-shield (aliases: ss, firewall/site-shield)
  terraform (alias: terraform/terraform)
  video-manager (aliases: vm, image-manager/video-manager)
  visitor-prioritization (aliases: vp, visitor-prioritization/visitor-prioritization)

Global Flags:
   --bash                 Output bash auto-complete (default: false)
   --zsh                      Output zsh auto-complete (default: false)
   --proxy value              Set a proxy to use
   --edgerc value, -e value   edgerc config path passed to executed commands, defaults to ~/.edgerc
   --section value, -s value  edgerc section name passed to executed commands, defaults to 'default'
   --version                  Output CLI version (default: false)

Copyright (C) Akamai Technologies, Inc
```

# Akamai EdgeWorkers の開発で Docker を利用するケース
Akamai Docker イメージを使えば Akamai EdgeWorkers CLI と Akamai Sandbox CLI をすぐに使えます。EdgeWorkers はエッジで JavaScript が動作できるサーバーレスのプラットフォームであり、Sandbox は EdgeWorkers などをローカルで動作できるテスト環境です。Akamai Docker イメージは一般的な開発やテスト環境を提供していないため、単体で完全な開発環境とはなりません。例えば、Visual Studio を使ってコードを書いたり、ブラウザを使ってコードの実行確認をするには、提供されている Docker イメージだけでは実現できません。しかし、次のように、ローカルホストと Docker 環境の間でディスクを共有することで、この問題は回避できます。

```
docker run -p 8080:9550 -it -v $HOME/dev/docker:/root/ -v \
$HOME/dev/sandboxes:/cli/.akamai-cli/cache/sandbox-cli/sandboxes/ \
akamai/shell
```
上記の例は Sandbox のログをローカル環境からも見られるようにした例ですが、必要なければ次のコマンドでも良いです。
```
docker run -p 8080:9550 -it -v $HOME/dev/docker:/root/ -v　akamai/shell
```
Sandbox は起動したホスト内でローカルプロキシーとして 9550 ポートを利用します（設定で変更することも可能）。``-p 8080:9550`` を指定することで、ローカルホスト内で起動したブラウザから 8080 ポート経由で Docker で動作している Sandbox 環境に接続できます。通常 EdgeWorkers では curl コマンドなどでリクエスト/レスポンスを確認できますが、ブラウザの挙動を確認したい場合はポートのマッピングを指定してください。通常は不要です。

``-v $HOME/dev/docker:/root/`` を指定することで、ローカルディスクと Docker 内のファイルシステムにマウントできます。ローカル環境の ``$HOME/dev/docker/`` が Docker 上の ``/root/`` にマウントされます。Akamai CLI では ~/.edgerc が必要になるので、マウントするディレクトリに .edgerc をコピーしておいてください。
```
cp ~/.edgerc ~/dev/docker/.edgerc
```
## Sandbox を使って EdgeWorkers の開発をするケース
EdgeWorkers の開発に Akamai Sandbox を使う場合、複数のターミナル（端末）が必要になります。ターミナルを使う例を示します。
<table>
  <caption>ターミナルの使い分け</caption>
  <thead>
    <tr>
      <th>ターミナル</th> <th>使い方</th>
    </tr>
  </thead>
  <tr>
    <td style="text-align:center;">Docker <BR> ターミナル 1</td> <td>Akamai CLI の起動。Curl などでの動作確認など。</td>
  </tr>
  <tr>
    <td style="text-align:center;">Docker <BR> ターミナル 2</td> <td>Akamai Sandbox の起動。フォアグラウンドで動作させ、常にログがコンソールに表示する状況にする。バックグラウンドで動作させれば、このターミナルは不要である。ログはファイルにも書き込みされているので参照は可能。</td>
  </tr>
  <tr>
    <td style="text-align:center;">Local Host <BR> ターミナル 1</td> <td>Visual Studio Code を使った開発</td>
  </tr>
  <tr>
    <td style="text-align:center;">Local Host <BR> ブラウザ</td> <td>localhost:8080 経由での動作確認</td>
  </tr>
</table>


### Docker ターミナル 2 の起動
ローカルマシンの複数のターミナルから、同一の Docker 環境に入る方法について説明します。まず、Docker を起動したターミナル 1 で以下のコマンドを実行して Docker のコンテナ ID を入手します。
```
docker ps 
```
次の出力結果では ``2851bb96426e`` がコンテナ ID となります。
```
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 
2851bb96426e akamai/shell "/bin/bash -lc '${0}…" 5 seconds ago Up 4 seconds frosty_engelbart 
```
macOS 上で別のターミナルを立ち上げ、次のコマンドを起動します。``-it`` で コンテナ ID を指定します。
```
docker exec -it 2851bb96426e bash 
```
Docker に入れたら、次のように Sandbox が起動できます。
```
akamai sandbox start
```
# おまけ： HTTPie を使って Akamai API エンドポイントを使う
Docker には Akamai CLI だけでなく、Akamai API をコマンドライン上から利用できる [HTTPie](https://techdocs.akamai.com/developer/docs/httpie-make-api-calls)  も含まれています。HTTPie を使えば、API のリファレンスに沿って、コマンドライン上から、API のエンドポイントに対してリクエストを送り Akamai の設定を制御できます。
```
Akamai DevOps [/workdir] >> http --auth-type=edgegrid -a default: :/edge-diagnostics/v1/edge-locations
```
上記の ``/edge-diagnostics/v1/edge-locations`` は [Edge Diagnostics API](https://techdocs.akamai.com/edge-diagnostics/reference/edge-diagnostics-api-1) の一つのエンドポイントです。もし権限関係のエラーが表示されたら、ロール設定が API クライアントに付与されていない可能性がありますので、Akamai Control Center の Identify Access Management から Edge Diagnostics に Read 権限が付与されているか確認してください。

Akamai のツール群は EdgeGrid を利用して認証/認可が行われます。HTTPie は EdgeGrid インタフェースを使って提供されるコマンドラインの一つです。``--auth-type=edgegrid`` と指定があり、.edgerc を読み込んで起動されます。 

# まとめ
Akamai Docker イメージを利用すると Akamai CLI、HTTPie などのツールをすぐに利用できます。Akamai のツールを学習するには便利ですので、是非ご活用ください。