インフラ構築を完全に自動化してみる

## はじめに
本業ではGo,Laravelでバックエンド開発したり、ECS,CDKを使ってDevOps周りを整えようと頑張ったりしてます。
今回はアプリケーションチームがインフラチームにインフラ構築依頼を出さなくても自律して環境構築ができるようにBackstageを利用するプランを考えて実装をしてみました。

## 対象読者
- プラットフォームエンジニアリングに興味がある方

## 目次
- 解決したい課題
- 参考書籍
- 採用技術
- 解決策
- 解決できた課題
- 解決できていない課題とその解決策
- 感じたこと

## 解決したい課題

#### インフラ構築にかかるコストが大きい
見積もりよりもインフラ構築にかかるコストが大きくなっていました。CDKによるインフラのコード化は行なっていますが、必要な情報を揃えるまでに時間がかかっています。その原因としては以下の**２つ**が考えられました。
 - **アプリケーション担当者とインフラ担当者の間でのコミュニケーションコスト**
     - お互いがお互いの作業完了を待ってしまう
 - **責任範囲をどう区切るかが難しいこと（Dockerfile,log出力,環境変数ファイルの編集）**
     - インフラ担当者がアプリケーションを構築する場合、アプリケーションの理解が必要
     - アプリケーション担当者がDockerfileを作成しようとすると、技術的な難しさがあることも多い


![Screenshot 2023-05-08 at 19.34.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620003/04b9f8e3-4746-4939-f581-6a82c9546096.png)

## 参考書籍

### 「[LeanとDevOpsの科学](https://www.amazon.co.jp/Lean%E3%81%A8DevOps%E3%81%AE%E7%A7%91%E5%AD%A6%EF%BC%BBAccelerate%EF%BC%BD-%E3%83%86%E3%82%AF%E3%83%8E%E3%83%AD%E3%82%B8%E3%83%BC%E3%81%AE%E6%88%A6%E7%95%A5%E7%9A%84%E6%B4%BB%E7%94%A8%E3%81%8C%E7%B5%84%E7%B9%94%E5%A4%89%E9%9D%A9%E3%82%92%E5%8A%A0%E9%80%9F%E3%81%99%E3%82%8B-impress-top-gear%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-ebook/dp/B07L2R3LTN/ref=sr_1_1?adgrpid=131611364341&hvadid=649790683622&hvdev=c&hvqmt=e&hvtargid=kwd-1644374046188&hydadcr=28581_14714094&jp-ad-ap=0&keywords=lean+%E3%81%A8+devops%E3%81%AE%E7%A7%91%E5%AD%A6&qid=1683539161&sr=8-1)」
この読んで、デリバリーのパフォーマンスの重要性を再認識しました。
特に重要だと思った部分としては
```
 - デプロイ頻度
 - コミットから本番デプロイまでの時間
 - 障害復旧時間
 - 変更失敗率
```
の４つが
```
 - 収益性
 - 市場占有率
 - 生産性
```
と明らかな相関関係があるというところでした。デプロイ頻度が多く、コミットから本番デプロイまでの時間が短いほど、ビジネス的にも大きな価値を生み出しているようです。
さらに、
```
 - デプロイ頻度
 - コミットから本番デプロイまでの時間
 - 障害復旧時間
 - 変更失敗率
```
の４つのパフォーマンスが良い組織では
```
 - テストの自動化
 - テストデータの管理
 - デプロイの自動化
 - トランクベースの開発
 - 情報セキュリティのシフトレフト
 - 疎結合のアーキテクチャ
 - バージョン管理
 - 監視
 - プロアクティブな通知
```
などを採用している割合が多いとのことでした。

![Screenshot 2023-05-08 at 19.43.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620003/886f4714-4c2d-0640-a3e2-18e89f87d5ee.png)


### 「[チームトポロジー　価値あるソフトウェアをすばやく届ける適応型組織設計](https://www.amazon.co.jp/%E3%83%81%E3%83%BC%E3%83%A0%E3%83%88%E3%83%9D%E3%83%AD%E3%82%B8%E3%83%BC-%E4%BE%A1%E5%80%A4%E3%81%82%E3%82%8B%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%82%92%E3%81%99%E3%81%B0%E3%82%84%E3%81%8F%E5%B1%8A%E3%81%91%E3%82%8B%E9%81%A9%E5%BF%9C%E5%9E%8B%E7%B5%84%E7%B9%94%E8%A8%AD%E8%A8%88-%E3%83%9E%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%BB%E3%82%B9%E3%82%B1%E3%83%AB%E3%83%88%E3%83%B3-ebook/dp/B09MS8BML8/ref=sr_1_1?adgrpid=134703044597&hvadid=651757270503&hvdev=c&hvqmt=e&hvtargid=kwd-1701042298287&hydadcr=2269_13596959&jp-ad-ap=0&keywords=%E3%83%81%E3%83%BC%E3%83%A0%E3%83%88%E3%83%9D%E3%83%AD%E3%82%B8%E3%83%BC&qid=1683542260&sr=8-1)」
特に重要だと感じた部分は
 - **コンウェイの法則**
     - システムを設計する組織は、その組織のコミュニケーション構造をコピーした構造の設計を作り出す
     - 逆コンウェイ戦略：採用したいアーキテクチャに合わせてコミュニケーション構造をデザインする
 - **チームファースト**
     - **ベストなやり方→チームに仕事が流れる状態** 
     - チーム対個人→チームのパフォーマンスが勝つ
     - チーム同士の連携方法が重要→**高凝集、疎結合**を達成できるように
 - **４つのチーム**
 - **３つのインタラクションモード**

の４つです。

## 実装内容
### 概要
Backstageで.envやビルドする際のパス、アプリケーションの名前などの情報を入力するとそのサービスが起動できるようにしました。

### 採用技術
 - [Backstage](https://backstage.io/)
 - [CDK python](https://aws.amazon.com/jp/cdk/)
 - [Github Actions](https://docs.github.com/ja/actions)
 - [AWS](https://aws.amazon.com/jp/)

### 概要図
![Screenshot 2023-05-08 at 22.09.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620003/ae29f128-c62c-c504-9a54-6a0eb91ab367.png)


### 短期的にできるようにしたいこと
- 指定できるAWSリソースの追加
     - Redis
     - メールサーバー
     - HTTPS対応
     - ドメイン自動取得

### 中長期的にできるようにしたいこと
- プロジェクトのテンプレート追加
    - huskyの設定
    - prettier,eslintの設定
    - dockerfile,docker-compose.yaml
    - 各ライブラリ、言語などのバージョン指定
- セキュリティテスト
- 負荷テスト


## 実装によって達成できそうなこと
 - インフラ構築の効率化・自動化
 - 責任範囲の明確化
 - インフラチームとアプリケーションチームとの疎結合化→お互いに作業の完了を待つ必要がなくなる
![Screenshot 2023-05-08 at 21.34.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620003/8efc9f39-12b8-cf90-822e-08b424164971.png)


### 副作用的に達成できそうなこと
 - 環境変数のバージョン管理
     - S3で環境変数を管理することが強制されたことでバージョン管理できるようになりました
 - 監視
     - github actionsによりCDKが実行されることでインフラ構築のログ監視が可能になりました。
![Screenshot 2023-05-08 at 21.30.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620003/2f2e20db-619b-4338-1391-303ab7738d1a.png)

## 解決できない課題
 - アプリケーションチームの技術習得コスト

イネイブリングチームを置くことで対応？
![Screenshot 2023-05-08 at 21.33.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620003/354159bd-c2ec-9467-4071-69b5c4b5622a.png)

## 感じたこと
 - CDKがめちゃくちゃいい
     - AWSの現在のリソース状況をデータベースとして扱って、そのデータに応じて操作を変更できる

## 新しく起きそうな問題
 - CDKコードとBackstageの開発、管理
     - 後方互換を基本的に保つ
     - 保てなくなったらバージョン変更
     ->メンテナンスチームで解決？

## 終わりに
今回はインフラ構築をアプリケーションチームに自律して行なってもらう方法を考えて実装してみました。
運用はこれからなので、その中で出てくる課題・解決策に関してもまた記事にしていこうと思います。