AWSメモ備忘録：AWS CLI, MySQL 設定、およびデータベース管理に関するガイドについて

## はじめに

クラウド環境でのシステム運用やデータ管理を行う上で、AWSの各種サービスやデータベースの活用は欠かせません。

:::note info
**本記事では、AWS CLI を使用した Secrets Manager のシークレット削除や、Amazon ECS 上のコンテナへのシェルアクセス方法について解説します。**
:::

加えて、MySQL および MariaDB のセットアップ方法や、データベースの基本的なテーブル構成についても紹介します。

### 1. Secrets Manager のシークレット削除
AWS Secrets Manager に保存されている `rds_password_v5` というシークレットを完全に削除するには、以下のコマンドを使用します。
```sh
aws secretsmanager delete-secret --secret-id rds_password_v5 --force-delete-without-recovery
```
このコマンドは、リカバリー期間を設けずに即座に削除するオプション `--force-delete-without-recovery` を指定しています。

### 2. Amazon ECS でのコンテナ内シェル実行
ECS クラスタ上で実行されているタスク内のコンテナにアクセスするには、以下のコマンドを使用します。
```sh
aws ecs execute-command --cluster my-ecs-cluster \
  --task xxx \
  --container my-app-repo \
  --command "/bin/sh" \
  --interactive
```
このコマンドは `--interactive` オプションを付けており、対話型セッションを開始できます。

## MySQL および MariaDB のインストールと接続

### 1. MySQL クライアントのインストール
Alpine Linux で MySQL クライアントをインストールするには、以下のコマンドを使用します。
```sh
apk add --no-cache mysql mysql-client
```

### 2. MariaDB への接続
環境変数を使用して MariaDB に接続するには、以下のコマンドを実行します。
```sh
mariadb -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER -p$MYSQL_PW --ssl=OFF $MYSQL_DB
```
ここでは `--ssl=OFF` により、SSL 接続を無効化しています。

## データベースの構築

### 1. ユーザーの作成
```sql
CREATE TABLE IF NOT EXISTS users (
    id VARCHAR(255) PRIMARY KEY,
    is_admin BOOLEAN,
    name VARCHAR(255),
    created_at DATETIME,
    updated_at DATETIME
);
```
```sql
INSERT INTO users (id, is_admin, name, created_at, updated_at) VALUES
('user1', false, 'User One', NOW(), NOW()),
('user2', false, 'User Two', NOW(), NOW()),
('user3', false, 'User Three', NOW(), NOW()),
('user4', false, 'User Four', NOW(), NOW()),
('user5', false, 'User Five', NOW(), NOW());
```

### 2. カテゴリの作成
```sql
CREATE TABLE IF NOT EXISTS categories (
    id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(255) NOT NULL,
    created_at DATETIME
);
```
```sql
INSERT INTO categories (id, title, created_at) VALUES
(1, '基本情報技術者', NOW()),
(2, '応用情報技術者', NOW()),
(3, 'AWSアソシエイト', NOW());
```

### 3. 質問の作成
```sql
CREATE TABLE IF NOT EXISTS questions (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id VARCHAR(255) NOT NULL,
    category_id INT NOT NULL,
    title VARCHAR(255),
    content TEXT,
    answer_id INT,
    created_at DATETIME,
    updated_at DATETIME,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    FOREIGN KEY (category_id) REFERENCES categories(id) ON DELETE CASCADE
);
```

```sql
INSERT INTO questions (id, user_id, category_id, title, content, answer_id, created_at, updated_at) VALUES
(1, 'user1', 1, 'ネットワークアドレス', 'IPアドレスクラスの範囲は？', 1, NOW(), NOW()),
(2, 'user2', 1, 'OS', 'Linux ディストリビューションの例は？', 5, NOW(), NOW()),
(3, 'user3', 2, 'SQL', 'データ取得に使うSQL文は？', 9, NOW(), NOW()),
(4, 'user4', 2, 'Python', 'Pythonの特徴は？', 13, NOW(), NOW()),
(5, 'user5', 3, '暗号技術', '暗号アルゴリズムの種類は？', 17, NOW(), NOW());
```

### 4. 選択肢の作成
```sql
CREATE TABLE IF NOT EXISTS choices (
    id INT PRIMARY KEY AUTO_INCREMENT,
    question_id INT NOT NULL,
    content VARCHAR(255),
    description TEXT,
    created_at DATETIME,
    updated_at DATETIME,
    FOREIGN KEY (question_id) REFERENCES questions(id) ON DELETE CASCADE
);
```

### 5. 回答の作成
```sql
CREATE TABLE IF NOT EXISTS answers (
    id INT PRIMARY KEY AUTO_INCREMENT,
    question_id INT NOT NULL,
    choice_id INT NOT NULL,
    explanation TEXT,
    created_at DATETIME,
    FOREIGN KEY (question_id) REFERENCES questions(id) ON DELETE CASCADE,
    FOREIGN KEY (choice_id) REFERENCES choices(id) ON DELETE CASCADE
);
```

### 6. スコア管理
```sql
CREATE TABLE IF NOT EXISTS scores (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id VARCHAR(255) NOT NULL,
    score INT,
    created_at DATETIME,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
```

```sql
INSERT INTO scores (user_id, score, created_at) VALUES
('user1', 85, NOW()),
('user2', 72, NOW()),
('user3', 90, NOW()),
('user4', 65, NOW()),
('user5', 78, NOW());
```

### 全体のSQL

```sql
-- ✅ ユーザーの作成
CREATE TABLE IF NOT EXISTS users (
    id VARCHAR(255) PRIMARY KEY,
    is_admin BOOLEAN,
    name VARCHAR(255),
    created_at DATETIME,
    updated_at DATETIME
);

INSERT INTO users (id, is_admin, name, created_at, updated_at) VALUES
('user1', false, 'User One', NOW(), NOW()),
('user2', false, 'User Two', NOW(), NOW()),
('user3', false, 'User Three', NOW(), NOW()),
('user4', false, 'User Four', NOW(), NOW()),
('user5', false, 'User Five', NOW(), NOW());

-- ✅ カテゴリの作成 (修正済み: `'` を正しく修正)
CREATE TABLE IF NOT EXISTS categories (
    id INT PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(255) NOT NULL,
    created_at DATETIME
);

INSERT INTO categories (id, title, created_at) VALUES
(1, '基本情報技術者', NOW()),
(2, '応用情報技術者', NOW()),
(3, 'AWSアソシエイト', NOW());

-- ✅ 質問の作成 (外部キー修正)
CREATE TABLE IF NOT EXISTS questions (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id VARCHAR(255) NOT NULL,
    category_id INT NOT NULL,
    title VARCHAR(255),
    content TEXT,
    answer_id INT,
    created_at DATETIME,
    updated_at DATETIME,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    FOREIGN KEY (category_id) REFERENCES categories(id) ON DELETE CASCADE
);

ALTER TABLE questions MODIFY choice1_id INT NULL;
ALTER TABLE questions MODIFY choice2_id INT NULL;
ALTER TABLE questions MODIFY choice3_id INT NULL;
ALTER TABLE questions MODIFY choice4_id INT NULL;

INSERT INTO questions (id, user_id, category_id, title, content, answer_id, created_at, updated_at) VALUES
(1, 'user1', 1, 'ネットワークアドレス', 'IPアドレスクラスの範囲は？', 1, NOW(), NOW()),
(2, 'user2', 1, 'OS', 'Linux ディストリビューションの例は？', 5, NOW(), NOW()),
(3, 'user3', 2, 'SQL', 'データ取得に使うSQL文は？', 9, NOW(), NOW()),
(4, 'user4', 2, 'Python', 'Pythonの特徴は？', 13, NOW(), NOW()),
(5, 'user5', 3, '暗号技術', '暗号アルゴリズムの種類は？', 17, NOW(), NOW());

-- ✅ 選択肢 (questions.id を外部キーに設定)
CREATE TABLE IF NOT EXISTS choices (
    id INT PRIMARY KEY AUTO_INCREMENT,
    question_id INT NOT NULL,
    content VARCHAR(255),
    description TEXT,
    created_at DATETIME,
    updated_at DATETIME,
    FOREIGN KEY (question_id) REFERENCES questions(id) ON DELETE CASCADE
);

INSERT INTO choices (id, question_id, content, description, created_at, updated_at) VALUES
(1, 1, '1.0.0.0 - 126.255.255.255', 'Aクラス', NOW(), NOW()),
(2, 1, '128.0.0.0 - 191.255.255.255', 'Bクラス', NOW(), NOW()),
(3, 1, '192.0.0.0 - 223.255.255.255', 'Cクラス', NOW(), NOW()),
(4, 1, '224.0.0.0 - 239.255.255.255', 'Dクラス', NOW(), NOW()),
(5, 2, 'Ubuntu', 'Debian系', NOW(), NOW()),
(6, 2, 'CentOS', 'RedHat系', NOW(), NOW()),
(7, 2, 'Windows', 'Windows系', NOW(), NOW()),
(8, 2, 'macOS', 'Mac系', NOW(), NOW()),
(9, 3, 'SELECT', 'データを取得する', NOW(), NOW()),
(10, 3, 'UPDATE', 'データを更新する', NOW(), NOW()),
(11, 3, 'DELETE', 'データを削除する', NOW(), NOW()),
(12, 3, 'INSERT', 'データを追加する', NOW(), NOW()),
(13, 4, 'インタープリター型', '逐次実行', NOW(), NOW()),
(14, 4, '静的型付け', '動的型付けの逆', NOW(), NOW()),
(15, 4, 'コンパイル言語', 'スクリプト言語ではない', NOW(), NOW()),
(16, 4, '手続き型のみ', 'オブジェクト指向も対応', NOW(), NOW()),
(17, 5, 'AES', '共通鍵暗号方式', NOW(), NOW()),
(18, 5, 'RSA', '公開鍵暗号方式', NOW(), NOW()),
(19, 5, 'MD5', 'ハッシュ関数', NOW(), NOW()),
(20, 5, 'DES', '古い共通鍵暗号方式', NOW(), NOW());

-- ✅ 回答 (choices.id を外部キーに設定)
CREATE TABLE IF NOT EXISTS answers (
    id INT PRIMARY KEY AUTO_INCREMENT,
    question_id INT NOT NULL,
    choice_id INT NOT NULL,
    explanation TEXT,
    created_at DATETIME,
    FOREIGN KEY (question_id) REFERENCES questions(id) ON DELETE CASCADE,
    FOREIGN KEY (choice_id) REFERENCES choices(id) ON DELETE CASCADE
);

INSERT INTO answers (id, question_id, choice_id, explanation, created_at) VALUES
(1, 1, 1, 'AクラスのIPアドレスの範囲', NOW()),
(2, 2, 5, 'UbuntuはDebian系のLinuxディストリビューション', NOW()),
(3, 3, 9, 'SELECT文はデータを取得するために使用', NOW()),
(4, 4, 13, 'Pythonはインタープリター型言語', NOW()),
(5, 5, 17, 'AESは共通鍵暗号方式の1つ', NOW());

-- ✅ スコア (users.id を外部キーに設定)
CREATE TABLE IF NOT EXISTS scores (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id VARCHAR(255) NOT NULL,
    score INT,
    created_at DATETIME,
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

INSERT INTO scores (user_id, score, created_at) VALUES
('user1', 85, NOW()),
('user2', 72, NOW()),
('user3', 90, NOW()),
('user4', 65, NOW()),
('user5', 78, NOW());
```


## まとめ
本記事では、AWS CLI を使用した Secrets Manager の操作、ECS でのコンテナ内シェル実行、MySQL/MariaDB のセットアップ方法、そしてデータベースのテーブル構成について説明しました。

これらの知識を活用し、クラウド環境やデータ管理をより効率的に行ってみてください！