AWS Well-Architected カスタムレンズを使ってみる

[AWS Well-Architected カスタムレンズの発表: 内部のベストプラクティスを使用して Well-Architected フレームワークを拡張する](https://aws.amazon.com/jp/blogs/news/well-architected-custom-lenses-internal-best-practices/) というアップデートがあったので使ってみます。

部署や特定案件、独自のベストプラクティスをLensとして定義して、Well-Architected Toolで管理・更新することができるようになりました。

事前知識として「Well-Architectedとは？」「レンズとは？」最初に記載しているので、不要な方は **[本題]Well-Architected カスタムレンズ** から読んでいただければ。

# 事前知識

## Well-Architectedとは？

クラウドアーキテクチャのベストプラクティス

[AWS Well-Architected](https://aws.amazon.com/jp/architecture/well-architected/)
> AWS Well-Architected は、クラウドアーキテクトがアプリケーションやワークロード向けに高い安全性、性能、障害耐性、効率性を備えたインフラストラクチャを構築する際に役立ちます。AWS Well-Architected では、5 つの柱（優れた運用効率、セキュリティ、信頼性、パフォーマンス効率、コストの最適化）に基づいて、お客様とパートナーがアーキテクチャを評価し、時間と共に拡大できる設計を実装するための一貫したアプローチを提供しています。

Well-Architectedは観点となる「柱」と、具体的なベストプラクティスである「質問」「チェック項目」により構成されます。

### 構成イメージ
```
- Well-Architected
  - 柱：セキュリティ
    - 質問：SEC 1. ワークロードを安全に運用するには、どうすればよいですか?
        - ベストプラクティス(≒チェック項目):アカウントを使用してワークロードを分ける
        - ...
    - 質問:SEC 2. ユーザー ID とマシン ID はどのように管理したらよいでしょうか?
    - ...
  - 柱：信頼性
  - ....
```


マネージメントコンソールから「Well-Architected Tool」を選択することで、ベストプラクティス(Well-Architected)に沿ったワークロードかどうかチェックし結果を管理・更新することができます。該当のベストプラクティスを実現するのに役立つリソース情報も表示してくれます。

![WA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/90b51c24-4f94-9315-6408-7a979bc41b19.png)




## レンズとは？

基本となるWell-Architectedに加えて特定の領域・観点に特化したベストプラクティスの質問を追加することができるものです。
[Lenses](https://docs.aws.amazon.com/ja_jp/wellarchitected/latest/userguide/lenses.html)

![Well-Architected_Tool.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/550afaae-f95a-2395-8562-c52e43158f2f.png)



### 構成イメージ
```markdown
- ワークロード
    - Well-Architected Framework
            - 柱[]
                - 質問[]
                    - ベストプラクティス[]
    - レンズ[]
        - 各種レンズ
            - 柱[]
                - 質問[]
                    - ベストプラクティス[]
```


ちなみに基礎となる「Well-Architected Framework」を外すことはできません。
[API](https://docs.aws.amazon.com/ja_jp/wellarchitected/latest/APIReference/API_CreateWorkload.html)も確認しましたが、「Well-Architected Framework」を付ける/外すをコントロールできそうなパラメータはありませんでした。

# [本題]Well-Architected カスタムレンズ

前述の「レンズ」を独自に作成・利用・共有できるようになったのが今回のアップデートです。

## カスタムレンズの作成と利用の流れ

### 作成
1. マネジメントコンソールから Well-Architected Tool > カスタムレンズ > カスタムレンズを作成を選択
1. レンズ定義用のテンプレートファイルをダウンロード(JSONファイル)
1. レンズ定義ファイルを編集し、アップロード
1. レンズを公開※する

※Lensには「公開(publish)」と「共有(share)」という概念があります。「公開」はレンズを作成したアカウント内で利用できるようにすること。「共有」は他のAWSアカウントでも使えるように共有することです。共有についても後述します。

### 利用
1. ワークロードのLensを選択する画面で公開されたLensが選択できるようになっているので選択

これで利用できます。

![Well-Architected_Tool.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/7f02ffe5-e857-e109-bdb7-b29e9d678cd8.png)


## 定義ファイルのフォーマット

定義ファイルのフォーマットは[こちら](https://docs.aws.amazon.com/ja_jp/wellarchitected/latest/userguide/lenses-format-specification.html)。

ドキュメントを読まなくてもテンプレートファイルをダウンロードして眺めれば、だいたいどこ触ればいいかわかると思います。

めちゃくちゃ雑に書くと、以下のような構成です。

```markdown
- pillars[] # 柱
  - questions[] # 質問
    - choices[] # ベストプラクティス(チェック項目)
    	- 内容
    	- helpfulResource # 画面右端に出す「便利なリソース」欄
    	- improvementPlan # リスクありと判断した場合に画面下に出す「改善計画」欄
		....
	- riskRules[] リスク判定条件
		- 条件(choicesのidで条件を記述) & リスク
```

おもしろいなと思ったのは[Risk Rules section](https://docs.aws.amazon.com/ja_jp/wellarchitected/latest/userguide/lenses-format-specification.html#lenses-format-risk-rules)のところで、細かくリスクの判定条件を指定できるところ。Well-Architectedではレビュー結果に応じてその項目のリスクを「高リスク」「中リスク」「リスクなし」と分類できます。レビュー後に改善をかけてこの「リスク」を減らしていくような使い方が想定されています。各チェックにも「優先順位」や「これができてるなら、ここはできてなくてもたいしたリスクではない」という場合があるので助かります。


2021/12/07現在、 **日本語での記述はほとんどの項目でできない** ようなので、英語で記述する必要があります。日本語を含むJSONを読み込ませたると以下のようなエラーが表示されます。

```
[Validation] Invalid lens description (must be 1-2048 characters, allowed characters are A-Z, 0-9, a-z, - _ . , : / ( ) @ ! & # + ' and ’)
```

## カスタムレンズの共有

カスタムレンズは他のAWSアカウントに共有することができます。ベストプラクティスは組織単位でアカウントはプロジェクト/環境単位というケースが多いと思うのでこれは嬉しいですね。
やり方はワークロードの共有と同じで、共有したいアカウントのIDを入力します。複数アカウントに共有したい場合はカンマ区切り。

### 共有する側アカウント：招待の送信
![Well-Architected_Tool.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/b43733a2-5d10-e631-8d9e-e4e1e08f5d4b.png)

### 共有される側アカウント：招待の承諾
![Well-Architected_Tool.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/53ba9462-cc2f-8bd9-3368-41f496029d0c.png)

承諾すると、共有されたレンズをワークロードに組み込むことができるようになります。

# 感想
今まで自分はチーム内のベストプラクティスや蓄積してきたレビュー観点を、タスク単位ではスプレッドシートや課題テンプレートのチェック項目として管理していました。ワークロード全体の新規開発時や定期的な見直しに[Well-Architectedを利用している](https://www.slideshare.net/shutaka1/aws-google-cloud-249475043)ので、そのタイミングでのチェックにカスタムLensは使ってみようと考えています。

今回は触れませんでしたがカスタムレンズを更新するとき差分のある質問を表示してくれたり、マイナーバージョンの変更(自動適用)をすると参照しているワークロード側で「この質問について更新があった」旨の表示がされるなど細かいところ気が利いています。

改善のアイディアなどはマネジメントコンソール左下隅にある「フィードバック」から送ってみようと思います。

![Well-Architected_Tool.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43631/de9113de-fb01-a0bb-b289-bb090ed26c8c.png)