クラウドサービスのIaCとCI/CDサービスの要約と比較

### コンセプトなど

IaC（Infrastructure as Code）は、インフラストラクチャリソース（サーバー、仮想マシン、ネットワーク、ストレージなど）の構成と管理をテキストファイルでコーディングする手法を指します。これらのファイルは通常、YAML、JSON、またはHashiCorp Configuration Language（HCL）などの宣言型言語で記述されます。その後、これらのファイルをバージョン管理システムで追跡および管理できます。

IaCの主な利点には次のものがあります：

- **再現性：** IaCはインフラストラクチャの構成と管理を再現可能にします。これにより、異なる環境で同じインフラストラクチャを簡単に作成でき、トラブルシューティングや復旧が容易になります。
- **一貫性：** IaCは、すべての環境でインフラストラクチャが一貫していることを確保するのに役立ちます。これにより、エラーが減少し、セキュリティが向上します。
- **自動化：** IaCを使用して、インフラストラクチャの構成と管理を自動化できます。これにより、時間を節約し、効率が向上します。
- **バージョン管理：** IaCをバージョン管理システムで追跡および管理できます。これにより、インフラストラクチャの構成の変更履歴を表示し、以前のバージョンに簡単に戻すことができます。

**CI/CD**（Continuous Integration/Continuous Delivery）は、ソフトウェア開発のプラクティスであり、ソフトウェア開発およびテストプロセスの各段階を自動化することを重視しています。CI/CDパイプラインは通常、次の手順を含みます：

1. **コードの提出：** 開発者がコードをバージョン管理システムに提出します。
2. **ビルド：** コードが自動的に実行可能ファイルにビルドされます。
3. **テスト：** 実行可能ファイルが自動的にテストされます。
4. **デプロイ：** テストが成功した場合、実行可能ファイルが本番環境にデプロイされます。

CI/CDの主な利点には次のものがあります：

- **迅速な更新：** CI/CDは、新機能や修正を顧客に迅速にリリースできるようにします。
- **高い品質：** CI/CDは、エラーを早期に発見して修正できるため、ソフトウェアの品質を向上させるのに役立ちます。
- **コスト削減：** CI/CDは多くの手動タスクを自動化できるため、コストを削減できます。
- **コラボレーションの向上：** CI/CDは、より頻繁なコード提出と統合を促進するため、チームメンバー間の協力を向上させます。

**IaCとCI/CDの関係**

IaCとCI/CDは密接に関連しています。IaCはインフラストラクチャを記述および管理するために使用され、CI/CDはインフラストラクチャの構成とデプロイを自動化するために使用されます。以下は、IaCとCI/CDを組み合わせて使用するいくつかの例です：

- CI/CDパイプラインを使用してIaCテンプレートを自動的に実行します。これにより、コードの変更ごとにインフラストラクチャを自動的に更新できます。
- IaCを使用してテスト環境のインフラストラクチャを定義します。その後、CI/CDパイプラインを使用してテスト環境を自動的に作成および破棄できます。
- IaCを使用して本番環境のデプロイに必要なインフラストラクチャを定義します。その後、CI/CDパイプラインを使用してそのインフラストラクチャを本番環境に自動的にデプロイできます。

IaCとCI/CDを組み合わせて使用することで、より再現性の高い、一貫性のある、スケーラブルで信頼性の高いインフラストラクチャを作成できます。また、新機能や修正をより迅速にリリースし、コストを削減できます。

### クラウドコンピューティングサービスのIaCサービスの要約と比較

**AWS**

- Amazon CloudFormation：AWSインフラストラクチャを宣言的な方法で記述および管理するためのテンプレートツール。CloudFormationテンプレートは、作成または更新するAWSリソースを定義するためのJSONまたはYAMLファイルです。StackSetsの更新をサポートしているので、変更点だけを実行します。便利な機能だと思います。
- AWS CloudFormation Registry：これはテンプレートのレジストリであり、CloudFormationテンプレートを保存および共有するために使用されます。CloudFormation Registryを使用すると、他の人とテンプレートを簡単に共有し、他の人のテンプレートから学ぶことができます。私はテンプレート作成に関して経験が不足しているため、このようなサービスはとても良いと思います。これは、GitHub Actionsのワークフローのリポジトリに似ており、ヒントを提供します。
- AWS OpsWorks：AWSリソースの構成と管理を自動化するための構成管理サービス。OpsWorksは、ChefやPuppetなどの構成管理ツールを使用して構成タスクを実行します。CloudFormationは主にインフラストラクチャリソースの管理に使用され、OpsWorksはアプリケーションの構成と管理に使用されます。
- AWS CodeDeploy：AWSインフラストラクチャにアプリケーションをデプロイするためのデプロイメントサービス。CodeDeployは、ブルーグリーンデプロイメントやローリングデプロイメントなどのさまざまなデプロイメント方法をサポートしています。これもCI/CDで使われます。
- AWS Serverless Application Model（SAM）：サーバーレスアプリケーションを構築、デプロイ、管理するためのツールとフレームワーク。SAMは、サーバーレスアプリケーションのアーキテクチャを定義するためにYAMLテンプレートを使用します。私はこのサービスを使ったことはありませんが、調査によると、サーバーレスアプリケーションは、LambdaやAPIエンドポイントなどがバックエンドで提供されています。メンテナンスしやすく拡張性があります。
- AWS Cloud Development Kit (AWS CDK) ：オープンソースのソフトウェア開発フレームワークであり、インフラ即コード (IaC) を用いて AWS 上のインフラストラクチャを定義およびプロビジョニングすることができます。CDK を使用すると、TypeScript、JavaScript、Python、Java、C# などの一般的なプログラミング言語を使用して、クラウドインフラストラクチャ を記述できます。記述したコードは、AWS CloudFormation テンプレートに変換され、AWS にデプロイされます。
- AWS Application Composer は、最新のアプリケーションのアーキテクチャ、開発、およびイテレーションを合理化し、加速するのに役立ちます。公式サイトによると、AWS Application Composer を使用すると、デプロイ準備が整ったコードとしてのインフラストラクチャ (IaC) に支えられた AWS サービスから最新のアプリケーションを視覚的に構成して構成できます。
- ECSやAWS Fargateなどのコンテナサービスは、dockerfileがあるとしても、それらも含まれます。
- System ManagerのRunDocumentは、セキュリティに関する学習をしているときにこのサービスを知ったため、他のものを連想しました。SSMのDocumentは、サーバー上のAgentを介して直接サーバーを実行するため、コードのデプロイが容易になります。シナリオを一元的に管理するのに便利です。CloudFormationがAWSのリソース全体を管理するのであれば、SSMはEC2クラスターを簡単に管理するためのものです。

**GCP**

- Google Cloud Deployment Managerは、GCPリソースのデプロイと管理に使用される完全マネージドのIaCサービスであり、他のサービスとの統合が良好です。Cloud BuildとCloud Monitoringなど。Cloud Source Repositories：Gitリポジトリをホストする完全マネージドのサービス。他のGCPサービス（Cloud BuildとCloud Deployなど）と統合できます。これらの3つのサービスは、AWSのPipelineに対応しています。

**Azure**

- Microsoftのクラウドサービスには詳しくないので、簡単に調べた結果、Azure Resource Managerテンプレート（ARMテンプレート）が公式のサービスのようです。ARMテンプレートは、Azureリソースを定義してデプロイするためのJSONベースのテンプレート言語であり、最終リソースの状態を定義する宣言的な言語です。Azure Resource Managerは、これらのリソースの作成と管理を行います。Azure PowerShell、Azure CLI、およびAzure REST APIを使用してデプロイできます。また、Bicepという言語があり、Azure Resource Managerテンプレートの抽象化レベルが高い言語です。C＃に似た構文を使用し、読み書きが容易になっています。Bicepには、条件ロジックやループなどの高度な機能もサポートされています。
- Azure DevOpsは、ソフトウェア開発ライフサイクル（SDLC）を管理するためのクラウドプラットフォームです。バージョン管理、ビルド、テスト、およびデプロイに使用されるさまざまなツールが含まれています。Azure DevOpsは、ARMテンプレートまたはBicepと組み合わせて、インフラストラクチャの構成とアプリケーションのデプロイを自動化するために使用できます。これはCI/CDツールのようです。

**Terraform**

どのクラウドも使われてるので、単独に出しました。

さまざまなインフラストラクチャリソース（GCPリソース、AWSリソース、Azureリソースなど）を宣言的に記述および管理するオープンソースのIaCツール。インフラストラクチャを定義するためにHashiCorp Configuration Language（HCL）を使用します。私が参加しているプロジェクトでは、相手側がTerraformを使用して管理していました。以前に学習したことはありますが、そのときに私の基本的な知識は不十分で、多くのプロセスを完全に理解することができませんでした。これからシステムを学習し直します。より深く理解できると信じています。

### クラウドコンピューティングでのCI/CDサービスの要約と比較

**AWS**：CodePipelineは、アプリケーションの構築、テスト、およびデプロイメントを完全にマネージドするサービスです。使いやすく、拡張性があり、他のAWSサービスとの統合も良好です。CodeCommit、CodeBuild、CodeDeployサービスが内部的に統合されています。以前はCodeStarもありましたが、2024 年 7 月 31 日をもって、Amazon Web Services (AWS) は AWS CodeStar プロジェクトの作成と閲覧のサポートを終了しますと公式ページに書いてあります。GitHubと似ていますが、機能が制限されており、AWSでの使用に限定されています。GitHubリポジトリからリソースを取得してデプロイできるので、便利な機能です。

**GCP**：Cloud Buildは、アプリケーションのビルドとテストを完全にマネージドするサービスであり、他のサービスとの統合が良好です。Cloud Deployは、アプリケーションのデプロイメントを行う完全にマネージドされたサービスです。さまざまなデプロイメント戦略をサポートし、他のGCPサービス（Cloud BuildとCloud Monitoringなど）と統合できます。Cloud Source Repositories：Gitリポジトリをホストする完全マネージドのサービス。他のGCPサービス（Cloud BuildとCloud Deployなど）と統合できます。これらの3つのサービスは、AWSのPipelineに対応しています。

**Azure**：Azure DevOps Pipelines。詳しくないので、名前だけ列挙しておきます。

### この文章のきっかけ

これらの情報を調査したのは、以前に使用したCloud Runサービスについて振り返りたかったためです。Cloud Runは、AWSのECSやFargateなどのサービスと類似したコンテナサービスです。

Cloud Runをデプロイする方法については、以前の経験が不足していたため、現在の理解をまとめてみました。

Dockerファイルを使用して、アプリケーションをコンテナ内で実行するサービスです。 `docker build`と `docker push`メソッドを使用して、デプロイ済みのイメージファイルをレジストリリポジトリにプッシュし、`gcloud run deploy`コマンドを使用してワンクリックでデプロイできます。ほとんどの場合、アプリケーションのデプロイメントを行いますが、私がオンラインで見つけた方法は主にFlaskフレームワークに関するものであり、私の理解には大きなバイアスがかかっていますが、実際にはAWS Lambdaで実行された簡単なプログラムのようなものも実行できます。

また、Cloud Build、Cloud Deploy、Cloud Runを統合すると、コードが変更されたときに自動的にデプロイメントがトリガーされるため、以前に行っていたGithub Actionsのworkflowと非常に似ています。便利です。ただし、ビジネス要件に応じて、単純なスクリプトであれば、自動デプロイやバージョン管理は不要で、対応するCLIコマンドを実行するだけで十分です。要件に応じて開発することが最も重要です。

### Recap

最近gitとdockerに関して学習しているため、色々纏めてみました。

クラウドプロバイダー（AWS、GCP、Azure）は、IaCおよびCI/CDのためのさまざまなサービスを提供しており、それぞれ異なる特徴や利点があります。適切なサービスを選択し、それらを組み合わせて使用することで、最適な開発プロセスを構築できます。

最後はTerraform学習をリベンジすることを決めました。