Akamai EdgeWorkersのWorkflow自動化

# 概要
本記事では、Github Actions機能を利用して、EdgeWorkers上での開発時に繰り返す必要のあるWorkflowを自動化する方法と手順を説明します。
具体的には、AkamaiのEdge Computing機能であるEdgeWorkersについて、以下のWorkflowを自動化します。

- Code管理
- Akamai NetworkのStaging/Production NetworkのDeploy

また、本記事ではWorkflowのBuild結果とDeploy結果の確認方法について述べます。
git commandのみでこれらのWorkflowが完結しますので、EdgeWorkersのヘビーユーザーやこれからEdgeWorkersを試す方にも、ぜひ参考にしていただければと思います。

*EdgeWorkersのWorkflow自動化イメージ :*
![Blank Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544527/e3871a1a-8310-628c-d6f5-94e475382fcc.png)
引用元：[Edgeworker flow diagram](https://github.com/jdmevo123/akamai-edgeworker-action#readme)


# 目次
- [EdgeWorkersとは](#edgeworkersとは)
- [GitHub Actionsとは](#github-actionsとは)
- [Workflow自動化のメリット](#workflow自動化のメリット)
- [想定読者](#想定読者)
- [事前準備(1) EdgeWorkers](#事前準備1-edgeworkers)
- [事前準備(2) GitHub RepositoryとWorkflow](#事前準備2-github-repositoryとworkflow)
- [事前準備(3) ローカル環境](#事前準備3-ローカル環境)
- [Workflow実行手順](#workflow実行手順)
- [Workflow実行結果の確認](#workflow実行結果の確認)
- [まとめ](#まとめ)

# EdgeWorkersとは
分散プラットフォームであるAkamaiのエッジサーバー上で、一般の開発者が独自に開発したJavaScriptのCodeを実行できるサービスです。
その他、EdgeWorkersと組み合わせて使用可能なKey-Value型のデータベースとしてEdgeKVサービスがあります。

参考：[EdgeWorkers:Akamaiのエッジサーバー上でJavascriptで書いたコードが実行可能に](https://www.akamai.com/ja/blog/developers/edgeworker)
参考：[Welcome to EdgeWorkers - Akamai TechDocs](https://techdocs.akamai.com/edgeworkers/docs)

# GitHub Actionsとは
GitHubが提供するCI/CDのためのワークフローエンジンです。
GitHub上で動作するサーバレス環境であり、GitHubのインフラ上でユーザの代わりにCommandやCodeを実行する機能です。
Github以外に特別なリソースを必要とせずCI/CD環境を簡単で手軽に構築できます。

参考：[GitHub Actions](https://docs.github.com/ja/actions)

# Workflow自動化のメリット
EdgeWorkers における JavaScript Code開発では、開発サイクル(EdgeWorkers JavaScript Codeの変更 → Akamai NetworkへDeploy → 動作確認)を何度も繰り返す必要があります。これらの開発サイクルをWorkflowとして自動化すれば、以下のメリットを得られます。
- Code変更と動作確認の開発作業に集中できる
- 開発作業の時間短縮
- 複数ブランチ・複数メンバーで作業可能

# 想定読者
したがって、本稿では以下のような読者を想定しています。
- EdgeWorkers開発サイクルを高速化したい方
- Sandbox的な使い方でEdgeWorkers機能をサクッと試したい方
- GitHubをCI/CD環境の一部として利用しており、EdgeWorkersも組み込みたい方

# 事前準備(1) EdgeWorkers
### Akamai API Clientの権限付与
Akamaiのサービスの統合管理コンソールである、Akamai Control Center (以降ACC) より、ご利用中のAkamai API ClientにEdgeWorkersのアクセス権(権限は「READ-WRITE」)を付与します。
![スクリーンショット 2022-11-01 21.53.02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544527/43823d07-625a-b1f5-929c-cd374ca063bc.jpeg)

Akamai API Clientを新規作成する場合、具体的な作成方法については以下の記事を参照ください。
参考：[Akamai API入門 Part 1 — API Client & EdgeGrid](https://www.akamai.com/ja/blog/developers/akamai-api-part1-api-client-edgegrid)

※EdgeWorkersを利用しており、EdgeWorkers JavaScript codeのDeploy、配信設定でBehaviorの有効化がお済みの方は、以降の[事前準備(1) EdgeWorkers](#事前準備1-edgeworkers)は不要です。
### EdgeWorker IDの作成

ACCの検索窓から「EdgeWorkers」と入力して検索して、EdgeWorkers Managementのダッシュボードを開きます。
本ダッシュボードにて、オレンジ色の「Create EdgeWorker ID」をクリックし「EdgeWorker ID」を作成します。
GitHub Actions設定と実行結果の確認時に必要となるため、EdgeWorker ID、EdgeWorkers Name、GroupIDをメモします。 
![スクリーンショット 2022-11-01 22.15.22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544527/2154fc94-e11d-05c9-fccb-dcd3480b505a.jpeg)

```
(例) EdgeWorker ID: 4985, EdgeWorkers Name: edgeworkers-test, GroupID:149969
```

### 配信設定のEdgeWorkers有効化
ACCより「Properties」にて、EdgeWorkersを有効化したい配信設定を開き、Behaviorから「EdgeWorkers」を選択します。
以下のように先程作成したEdgeWorker IDを選択し、該当の配信設定をStaging/ProductionにDeployします。
![スクリーンショット 2022-11-16 14.22.15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544527/79389733-faf9-c310-0f78-2dd2fe7b4af3.jpeg)

EdgeWorker ID作成、EdgeWorkers JavaScript Code作成、配信設定のEdgeWorkers有効化の詳細手順は、以下を参照してください。
参考：[EdgeWorkers：AkamaiのEdgeサーバー上でjavascriptで書いたコードが実行可能に](https://www.akamai.com/ja/blog/developers/edgeworker)


# 事前準備(2) GitHub RepositoryとWorkflow
### GitHub Repository作成

EdgeWorkers用にRepositoryを作成します。RepositoryはPrivate/Publicどちらでも利用可能ですが、Private にすることを推奨します。
Repository Nameは自由に設定していただいて問題ありませんが、本記事の例ではEdgeWorkers Nameと同じ「edgeworkers-test」をRepository Nameとして設定します。
![スクリーンショット 2022-11-02 18.43.53.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544527/bbdffa44-8633-bc62-cff5-383e584014ff.jpeg)

```
(例) Repository Name: edgeworkers-test
```

### GitHub Workflow作成
次に、作成したRepositoryにGitHub Workflowを作成します。
対象Repositoryの「Actions」タブの画面で、「Simple workflow」の「Configure」を選択します。
Worflow作成に必要最低限のファイルが作成されます。
![スクリーンショット 2022-11-02 18.14.01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544527/1bacacc0-dbab-e5e2-ebe7-d3191dcf1b51.jpeg)

/.github/workflows/blank.yamlファイルが自動作成されますので、ファイル名をblank.yml -> main.ymlに変更します。

次に、EdgeWorkersのWorkflowを自動化するためのymlファイルを定義します。
画面右側の「Marketplace」タブを選択し、検索窓からキーワードを入力して出力された「Deploy Akamai EdgeWorkers」を選択します。
 ![スクリーンショット 2022-06-23 15.41.55.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544527/780b271f-17a7-4260-1b4f-1e7190c7e1ec.jpeg)

「Deploy Akamai EdgeWorkers」のInstallationのScriptをコピーし、main.ymlファイルに対して以下の修正作業を行ってください。
1. main.ymlファイル内の26行目の```uses: actions/checkout@v3```までを残して27行目以降を削除します。
2. コピーした「Deploy Akamai EdgeWorkers」のInstallationのScriptをmain.ymlファイルの27行目以降にペーストします。
![スクリーンショット 2022-06-23 15.43.37.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544527/d2154047-f761-1f92-b409-59dd0d7cb3dc.jpeg)
3. Credential情報の参照先の記述が必要となるため、```env: EDGERC: ${{ secrets.EDGERC }}```を31,32行目に追加します。
4. edgeworkersName、network、groupidをご自身のEdgeWokersの設定内容に更新します。networkはstaging or productionを選択できます。
```(例) edgeworkersName:"edgeworkers-test", network:"staging", GroupID:"149969"```
5. Start commitをクリックして、編集したyamlファイルを保存します。
![スクリーンショット 2022-11-14 20.50.32.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544527/5c3cccbc-5f32-760e-5fbc-c78902f47546.jpeg)
以上でWorkflowを自動化するためのymlファイルの定義は完了です。
修正後のmain.yamlファイル例は以下となります。1-4の作業の代わりに、本Scriptをコピー＆ペーストし、手順3で実施したedgeworkersName、network、groupidをご自身のEdgeWokersの設定内容に更新して利用することも可能です。
```
# This is a basic workflow to help you get started with Actions

name: CI

# Controls when the workflow will run
on:
  # Triggers the workflow on push or pull request events but only for the "main" branch
  push:
    branches: ["main"]
  pull_request:
    branches: ["main"]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v3
      - name: Deploy Akamai Edgeworkers
        # You may pin to the exact commit or the version.
        uses: jdmevo123/akamai-edgeworker-action@1.1
        env:
          EDGERC: ${{ secrets.EDGERC }}
        with:
          # Name of Edgeworker
          edgeworkersName: "edgeworkers-test"
          # Network you wish to activate
          network: "staging" # default is staging
          # GroupID for new registrations
          groupid: "149969"
```
ymlファイルのSyntaxの解説は以下の公式ページをご参照ください。
参考：[Understanding GitHub Actions](https://docs.github.com/ja/actions/learn-github-actions/understanding-github-actions)

### Akamai API ClientのCredential情報をRepositoryに登録
「Settings」タブの画面から、「Security - Sercrets - Actions」を選択します。
Actions secretsの画面に遷移しますので、「New repository secret」を選択して「EDGERC」という名前でCrendential情報を登録します。
![スクリーンショット 2022-11-14 20.57.51.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544527/04ab14c5-b035-856f-bf92-0dd6751214a8.jpeg)
Credential情報はAPIアクセスが可能なセンシティブな情報であるため、RepositoryのCode内に設置せず、Repository内のSecretsに保存する必要があるためです。
また、GitHub ActionsからAkamai API Clientを呼び出すために、**SecretのSection名は「edgeworkers」を指定する必要があるのでご注意ください。**
![スクリーンショット 2022-11-14 21.00.18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544527/12dbe663-6104-90a5-3bd1-5ff2d9331777.jpeg)
![スクリーンショット 2022-11-14 21.02.42.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544527/bd4076f8-3751-1056-d6ff-8cf6eb1f8f51.jpeg)

# 事前準備(3) ローカル環境
### Repositoryのgit clone
作成したRepositoryをローカル環境にgit cloneします。
```
$ git clone https://github.com/{username}/{repository name}.git
```

### EdgeWorkers JavaScript Codeの設置
git cloneしたRepositoryのディレクトリに移動して、EdgeWorkers JavaScript Codeを設置します。
EdgeWorkers JavaScript CodeのDownloadは、ACCから「Download code bundle」またはAkamai CLI等で行います。
![スクリーンショット 2022-11-14 21.41.16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544527/52948652-2bb3-b1cb-542f-19deac6bdf8b.jpeg)

以上、EdgeWorkers, GitHub Repository, ローカル環境の事前準備は完了です。


# Workflow実行手順
自動化されたEdgeWorkersのWorkflowの実行と確認を以下の手順で実施します。


### 1. EdgeWorkers JavaScript Codeの編集
git cloneしたRepositoryのディレクトリにて、EdgeWorkersのcodeを編集します。
例えば、bundle.jsonファイルを開き、EdgeWorkersのversionを変更します。以下の例では、version 2.4に変更します。
![スクリーンショット 2022-11-02 12.35.07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544527/f5ed3398-96ae-dcea-29ae-b4a4c771ca3f.jpeg)


### 2. git commitとgit push 
EdgeWorkers JavaScript Codeの編集が完了したらgit commitとgit pushを実行します。
git pushコマンドを実行すると、Repositoryのcodeがmain branchにcommitされるとともに、WorkflowのScriptにて指定したAkamai Staging/Production Networkに自動でDeployされます。
```
$ git add .
$ git commit -m "comment"
$ git push -u origin --all  
```

# Workflow実行結果の確認
### 1. WorkflowのBuild結果
実行したWorkflowのBuild結果は、 GitHubの「Actions」タブの該当のWorkflowから各Build結果について確認することが出来ます。
また、Buildに失敗した場合は、Workflow実行が途中で止まるため、AkamaiのStaging/Producion NetworkにDeployされません。

実行中のBuild結果例
![スクリーンショット 2022-11-02 15.04.39.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544527/c819a16b-48be-a53b-afa1-00eaee7c300c.jpeg)

実行成功時のBuild結果例
![スクリーンショット 2022-11-02 15.18.10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544527/e6f39de3-db98-4b4f-627b-14cd01152436.jpeg)


### 2. EdgeWorkersのDeploy結果
ACCの「EdgeWorkers」の画面にて、Akamai Staging/Production NetworkのDeploy結果について確認することが出来ます。
以下の例は、version 2.4で作成したEdgeWorkers Codeを一連のWorkflowを実行して、Akamai Staging NetworkにDeployした結果です。
![スクリーンショット 2022-11-02 15.21.37.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544527/dc86cb2c-bc1c-18e8-27f5-adaf72ab1796.jpeg)

Akamaiでは開発者向けにCLI・APIが用意されており、GUI以外でもAkamai Staging/Production NetworkにDeployした結果の確認が可能です。
以下はAkamai CLIによる確認結果の一例となります。
```
➜  ~ akamai edgeworkers status --section {section name} 4985
------------------------------------------------------------------------------------------------------------------------------
--- The following EdgeWorker Activations currently exist for account: X-XXXXX, ewId: 4985, version: any, activationId: any ---
------------------------------------------------------------------------------------------------------------------------------
┌─────────┬──────────────┬─────────┬──────────────┬────────────┬───────────┬──────────────────┬────────────────────────┐
│ (index) │ edgeWorkerId │ version │ activationId │   status   │  network  │    createdBy     │      createdTime       │
├─────────┼──────────────┼─────────┼──────────────┼────────────┼───────────┼──────────────────┼────────────────────────┤
│    0    │     4985     │  '2.4'  │      21      │ 'COMPLETE' │ 'STAGING' │ 'knakagaw_admin' │ '2022-11-02T06:05:17Z' │
│    1    │     4985     │  '2.3'  │      20      │ 'COMPLETE' │ 'STAGING' │ 'knakagaw_admin' │ '2022-06-23T07:47:09Z' │
<<< snip >>>
```


# まとめ
GitHub Actions機能を利用した、EdgeWorkersのCode管理からAkamai Staging/Production NetworkのDeployまでのWorkflow自動化を紹介しました。
EdgeWorkersで何ができるのかをいろいろ試したい方に、このようなCI/CD環境を用意しておくと、同じ作業を繰り返すストレスから解放されると思いますので、本記事をご参考にしていただければと思います。