【AWS】構成管理サービス

# 構成管理サービス

## 構成管理に関する重要用語
### ◉プロビジョニング
複数の**ITリソース（サーバー／ネットワーク／DB／ストレージなど）**をシステムの利用状況や障害発生の状況に応じて、**動的に利用したり割り当てる**

### ◉デプロイ
サーバーに**ファイル（バイナリファイル／ソースコード）**や**アセット（その他ドキュメントをまとめたもの）**を配置して、利用できる状況にすること

:::note info
AWSでは環境構築に関わる作業を自動化するためのサービスが提供されている
:::

## コードによるインフラストラクチャ構成管理
### ◉オンプレ環境構築時の課題
- **作業中にミスが発生**する可能性がある
- 導入後に構成変更があることを考慮して、**インフラストラクチャ管理（設計書やサーバーのパラメータなど）が必要**

### ◉Infrastructure as Code（IaC）
- インフラストラクチャ構築作業を**コードで記述して管理する考え方**
- **定義ファイルをコーディング**して、コードを実行することでリソースのプロビジョニングが可能
- コードを**そのまま流用**できる
- インフラストラクチャ構築手順の**バージョン管理が簡単**にできる

:::note info
バージョン管理
アプリケーション開発やドキュメント作成時などの履歴を管理すること
:::

## AWS CloudFormation
**AWS内の全てのインフラストラクチャリソースを自動でプロビジョニングできるサービス**

### ◉テンプレート
- CloudFormationの設定ファイルのこと
- AWSリソースを**JSON or YAMLフォーマット**で記述する

### ◉スタック
テンプレートを利用してCloudFormationによってプロビジョニングされる**AWSリソースの集合**

[![Image from Gyazo](https://i.gyazo.com/4980e9c94a16935889e4ea2be282f2d9.png)](https://gyazo.com/4980e9c94a16935889e4ea2be282f2d9)

### ◉JSONとYAMLのフォーマット
**キーとバリュー**で構成されていて、構造化データを表現するフォーマット
#### ◎JSON

```json
{
 "key1": "連続したデータの表記",
 "key2": "カンマを使って区切る"
}

{
 "key": ["配列の表記", "角カッコを使用する"]
}
```
#### ◎YAML

```yaml
key1: 連続したデータの表記
key2: 改行して記述する

key: 
- 配列の表記
- 行頭にハイフンを記述する

key:
  key2: 入れ子は半角２文字分のインデントをつける
```
### ◉CloudFormationの設定
| 主要な項目 | 説明 |
|:-:|:-:|
| AWSTemplateFormatVersion  | CloudFormationテンプレートのバージョンを指定  |
| Description  | テンプレートの説明を記述  |
| Pamameters  | テンプレート実行時に利用できる値を指定  |
| Resources  | プロビジョニングしたいAWSリソースとその設定を記述  |
| Outputs  | スタック作成後に出力したい項目を指定  |

#### ◎JSON形式
```json
{
  "AWSTemplateFormatVersion" : "version date",

  "Description" : "JSON string",

  "Metadata" : {
    "template metadata"
  },

  "Parameters" : {
    "set of parameters"
  },
  
  "Rules" : {
    "set of rules"
  },

  "Mappings" : {
    "set of mappings"
  },

  "Conditions" : {
    "set of conditions"
  },

  "Transform" : {
    "set of transforms"
  },

  "Resources" : {
    "set of resources"
  },
  
  "Outputs" : {
    "set of outputs"
  }
}
```

#### ◎YAML形式
```yaml
---
AWSTemplateFormatVersion: "version date"

Description:
  String

Metadata:
  template metadata

Parameters:
  set of parameters

Rules:
  set of rules

Mappings:
  set of mappings

Conditions:
  set of conditions

Transform:
  set of transforms

Resources:
  set of resources

Outputs:
  set of outputs

```
## AWS Elastic Beanstalk
- **Webアプリケーションやサービスをサーバーにデプロイでき、実行環境の管理を行うことができる**
- **自動的に容量プロビジョニング／負荷分散／拡張／アプリケーションの状態の監視を行う**

### ◉対応言語
- Java
- .NET
- PHP
- Node.js
- Python
- Ruby
- Go 
- Dockerにも対応

### ◉デプロイサーバー
- Apache HTTP Server
- Nginx
- Passenger
- IIS（Microsoft Internet Information Services）

## その他の構成管理サービス
### ◉AWS OpsWorks
- **サーバー構築作業を自動化する**構成管理サービス
- デプロイ／プロビジョニング／リリース後の監視機能
- **Chef／Puppet**などのサーバーの構成を自動化するツールを利用できる

#### ◎自動化できる手順
1. EC2インスタンスを作成し、サーバーを準備
1. Chefのレシピを実行して、必要なソフトウェアをサーバーにインストール
1. Chefのレシピを実行して、アプリケーションをデプロイ

:::note info
Chef
・インフラにおけるサーバ構成管理や、サーバへのファイル展開作業（プロビジョニング）を自動化するオープンソース・ソフトウェア
・Rubyで実装
・この構成管理の情報を「レシピ（Recipe）」、レシピの集合体である「クックブック（Cookbook）」として定義

Puppet
・OS設定やアプリケーションの構築を自動化するオープンソース・ソフトウェア
・マニフェスト(manifest)に記述
・サーバの台数によらずマニフェストの構成どおりにインフラを自動的にセットアップする
:::

### ◉AWS CodeDeploy
アプリケーションの**デプロイを自動化するサービス**

#### 参考

https://aws.amazon.com/jp/cloudformation/

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/sample-templates-services-us-west-2.html

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html

https://aws.amazon.com/jp/elasticbeanstalk/

https://aws.amazon.com/jp/opsworks/

https://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/welcome.html

https://openstandia.jp/oss_info/chef/

https://openstandia.jp/oss_info/puppet/

https://aws.amazon.com/jp/codedeploy/