AWS構築にあたりエラー解決・各設定項目を整理！

先日、改めてAWSに基本構成を構築していました。
作業していたところで詰まったところや疑問に思ったことをリストアップして改めて整理してみました。


## MySQLがインストールできない
sudo yum install -y mysql-community-serverを実行すると下記の出力結果が出ました。
mysql-community-server は EL7 (CentOS 7 / RHEL 7 互換) のパッケージですが、Amazon Linux 2 や Amazon Linux 2023 では OpenSSL のバージョンが異なるため、この問題が発生することがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/7ba64e12-5a42-b1b6-1b8c-053256e0efad.png)

```
- nothing provides libcrypto.so.10()(64bit) needed by mysql-community-server-8.0.11-1.el7.x86_64 from mysql80-community'
  # mysql80-community リポジトリからインストールしようとしている mysql-community-server-8.0.11-1.el7.x86_64 に libcrypto.so.10 (64ビット版) が必要ですが、それを提供するパッケージが見つかりません
```
libcrypto.so.10 は OpenSSL の一部であり、暗号化機能を提供するライブラリです。
調べてみるとこのエラーは、mysql-community-server のインストール時に libcrypto.so.10 というライブラリが不足しているために発生しているとのこと。

そもそもmysql-community-server のインストールには libcrypto.so.10 を提供する compat-openssl10 が必要。

libcrypto.so.10 は OpenSSL の一部であり、おそらく OpenSSL が正しくインストールされていないか、バージョンの不整合が原因であるとのことでした。

いくつか調べてみるとcompat-openssl10をインストールすることで解決するとのこと。
compat-openssl10をインストールしてみます。

```
sudo yum install -y compat-openssl10
```
compat-openssl10はOpenSSL 1.0 の互換パッケージ です。
CentOS 7 / RHEL 7 / Amazon Linux 2 などの環境で、新しい OpenSSL バージョン（1.1 や 3.0）では動作しない古いソフトウェアをサポートするためのパッケージ となります。

実行するとNo match argument: compat-openssl10が出ました。見つからないとのこと。さてどうしたものか・・
compat-openssl10 を CentOS 8 Stream から直接インストールすることにしました。
```
sudo yum install http://mirror.centos.org/centos/8-stream/AppStream/x86_64/os/Packages/compat-openssl10-1.0.2o-3.el8.x86_64.rpm
→Errors during downloading metadata for repository 'epel'
```
mirror.centos.org の CentOS 8 Stream は現在もメンテナンス中だが、パッケージが削除または移動された可能性がありメタデータ (repomd.xml) を取得できず、インストールが失敗してしまった。
そもそもAmazon Linux 2023 には amazon-linux-extras が含まれていないとのこと。
```
sudo yum install http://repo.okay.com.mx/centos/8/x86_64/release/compat-openssl10-1.0.2o-3.el8.x86_64.rpm
・
・
Installed:
  compat-openssl10-1:1.0.2o-3.el8.x86_64         gc-8.0.4-5.amzn2023.0.2.x86_64         guile22-2.2.7-2.amzn2023.0.3.x86_64
  libtool-ltdl-2.4.7-1.amzn2023.0.3.x86_64       make-1:4.3-5.amzn2023.0.2.x86_64

Complete!
```
次にMySQLのリポジトリを追加します。
```
wget https://dev.mysql.com/get/mysql80-community-release-el7-5.noarch.rpm
```

そしてもう一度sudo yum install -y mysql-community-serverを実行します。
```
sudo yum install -y mysql-community-server
・
・
・
Installed:
  mysql-community-client-8.0.41-1.el7.x86_64               mysql-community-client-plugins-8.0.41-1.el7.x86_64   mysql-community-c
  mysql-community-icu-data-files-8.0.41-1.el7.x86_64       mysql-community-libs-8.0.41-1.el7.x86_64             mysql-community-s
  ncurses-compat-libs-6.2-4.20200222.amzn2023.0.6.x86_64

Complete!
```
インストールできました。

参考にしたドキュメント

https://qiita.com/Code_Dejiro/items/c97c400b92a85dce4468

https://qiita.com/yuyanstart/items/e8a6f1d2fd7cbf1cfd59

## パスベースルーティングとホストベースルーティング（ALB）
ALB（Application Load Balancer） では、リクエストを振り分ける方法として パスベースルーティング と ホストベースルーティング の2種類があります。それぞれの違いを整理します。

### パスベースルーティング
リクエストの「URLのパス」に応じて、適切なターゲットグループへルーティングする方式です。
URLのパスをもとに適切なターゲットグループに振り分けます。
仮にhttps://~/appのURLでリクエストがあればターゲットグループappへ
https://~/imageのURLでリクエストがあればターゲットグループimageへと振り分けます。

1つのドメインで複数のアプリ（/shop /blog /admin）というふうに分けたりする際に使用されます。
ほかにもAPIサーバー、静的なコンテンツサーバー、動的なコンテンツサーバーなど・・

### ホストベースルーティング
リクエスト先の「ホスト名（ドメイン名）」に応じて、異なるターゲットグループへルーティングする方式です。
ホスト名（FQDN、ドメイン部分）を見て、適切なターゲットグループへルーティングする方式です。
https://app1.example.com ならApp1用のサーバーが存在するターゲットグループAへ
https://app2.example.com ならApp2用のサーバーが存在するターゲットグループBへ

複数のドメインで運用したりする場合に使用されます。

||パスベースルーティング |ホストベースルーティング|
|:--------------|:--------------|:--------------|
|ルーティング方式           |URLのパスによってTGを指定する|ドメイン名によってTGを指定する|
|使用用途|一つのドメインで複数のアプリを管理する場合|複数のドメインで運用する場合|
|例|/image→画像用サーバーのTG|blog.example.com→ブログ用サーバーのTG
|DNS設定|ドメインは変わらないので不要|複数のドメインを使用するので必要|

## 「DNSホスト名属性」と「DNS解決属性」
VPCを作成するときに出てくるこれ。DNSに関してはRoute53で設定するものかと思っていたので確認しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/82a83256-9daf-57ef-ef64-66e96dc933c2.png)

**・ DNSホスト名属性（Enable DNS hostnames）**
「サーバーにわかりやすい名前をつけるか？」を決める設定です。
AWSが自動的に構築したサーバーに対してホスト名を割り振ってくれます。
この設定をオフにするとIPアドレスでしか調べるしかありません。

DNSホスト名属性を有効にしただけでは、名前解決できないこともあります。なぜか？DNS解決属性を有効にしておかないとそもそものDNSの機能を使うことをできないからです。

**引用元　Amazon DNS について理解する**
> 属性の両方が true に設定されている場合、次のようになります。パブリック IP アドレスを持つインスタンスは、対応するパブリック DNS ホスト名を受け取ります。Amazon Route 53 Resolver サーバーは、Amazon が提供するプライベート DNS ホスト名を解決できます。少なくとも 1 つの属性が false に設定されている場合、次のようになります。
パブリック IP アドレスを持つインスタンスは、対応するパブリック DNS ホスト名を受け取りません。
Amazon Route 53 Resolver は、Amazon が提供するプライベート DNS ホスト名を解決できません。

**・DNS解決属性（Enable DNS resolution）**
VPCの中で、ホスト名をIPアドレスに変換するのか？を決める設定です。そもそものDNSの機能をこのVPCで有効にするかしないかの設定です。

|設定項目        |有効 |無効|
|:--------------|:--------------|:--------------|
|DNSホスト名属性           |AWSがEC2などのサーバーに ホスト名（例: ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com）を自動で割り当てる　|IPアドレスしか割り当てられない|
|DNS解決属性|ホスト名をIPアドレスに変換できる（DNS機能が働く）|名前解決（ホスト名→IPアドレス）ができない（IPアドレス直接指定が必須）|


参考にしたドキュメント

https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/AmazonDNS-concepts.html#vpc-dns-support


## 「Identity Center でユーザーを指定する」について
IAMユーザーを作成する際に「Identity Center でユーザーを指定する - 推奨」と「IAMユーザーを作成します」の2つがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/ee3eb3e4-7817-7f37-242e-631c06480ab6.png)
従業員ユーザーを作成または接続し、マルチアカウントで使用する際にユーザーを一元管理できます。
旧 AWS SSOと同じ機能です。

## セキュリティグループとネットワークACLの違い
SGはインスタンスレベルで設定しACLはサブネットレベルで設定するものです。どちらでもアクセス制御できるように見えますがこれには使用パターンがあります。

### NACLの使用パターンについて
基本的にはセキュリティグループでアクセスを制御します。
ACL で制御するパターンとしては、特定の IP アドレスから攻撃を受けていて VPC or サブネット全体でブロックしたい等のパターンの時に使用します。

## 参考にしたドキュメント

https://dev.classmethod.jp/articles/amazon-vpc-acl/

https://dev.classmethod.jp/articles/why-i-prefer-sg-to-nacl/

## 他にもこんな記事を書いています！
https://qiita.com/mmurm/items/6863f8409ee37dfbbe2d

https://qiita.com/mmurm/items/8f421f00a23c8a4fda00

https://qiita.com/mmurm/items/9e225a6e471516101023