AWSコンテナ設計・構築本格入門 2025年にやってみる

# Cloud9が動かない問題への対処
Cloud9がいつの間にか新規での利用受付を停止したようなので、EC2インスタンスからで問題なし。
### EC2の用途
基本的にdockerのイメージをビルドしてECRに登録するだったり、ECRに疎通確認をするくらいの用途なので、IDEとしての機能は使わない。
### 設定方法
1. cloud formation のtemplate「network_step1/2」に以下を追記し、セキュリティグループを作成
    ```yaml
      ### Local PC -> VPC endpoint
      sbcntrSgManagementIngressSSH:
        Type: AWS::EC2::SecurityGroupIngress
        Properties:
          IpProtocol: tcp
          Description: SSH access from your IP (replace CidrIp accordingly)
          FromPort: 22
          GroupId:
            Fn::GetAtt:
              - sbcntrSgManagement
              - GroupId
          ToPort: 22
          CidrIp: xxx.xxx.xxx.xx/32 ここにローカルPCのIPをいｒ
    ```
1. EC2インスタンスを作成。イメージを作るときに容量が足りないと面倒なので、無料利用枠の30GB。t2.microでOK。
1. EC2インスタンス作成時に払いだしたキーペアでSSHクライアントを使ってSSHで接続。
1. ※311ぺーｊあたりのDBにテーブルとデータ投入をするところでprismaのmigrateコマンドがうまくうごかなかったので（方法はあるかもですが面倒なのでいかSQLを実行して作成します。
   ```
    use sbcntrapp;
    CREATE TABLE User (
    id INT AUTO_INCREMENT PRIMARY KEY,
     createdAt DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
     updatedAt DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP    ON UPDATE CURRENT_TIMESTAMP,
     name VARCHAR(191),
     email VARCHAR(191) NOT NULL UNIQUE,
     hashedPassword VARCHAR(191),
     role VARCHAR(191) NOT NULL DEFAULT 'user'
    );


    CREATE TABLE Session (
     id INT AUTO_INCREMENT PRIMARY KEY,
     createdAt DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
     updatedAt DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
     expiresAt DATETIME,
     handle VARCHAR(191) NOT NULL UNIQUE,
     userId INT,
     hashedSessionToken VARCHAR(191),
     antiCSRFToken VARCHAR(191),
     publicData TEXT,
     privateData TEXT,
     CONSTRAINT fk_user FOREIGN KEY (userId) REFERENCES User(id) ON DELETE SET NULL
    );
    
    CREATE TABLE Item (
     id INT AUTO_INCREMENT PRIMARY KEY,
     createdAt DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
     updatedAt DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
     name VARCHAR(191) NOT NULL,
     title VARCHAR(191) NOT NULL,
     img VARCHAR(191) NOT NULL,
     favorite BOOLEAN
    );
    
    CREATE TABLE Notification (
     id INT AUTO_INCREMENT PRIMARY KEY,
     createdAt DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
     updatedAt DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
     title VARCHAR(191) NOT NULL,
     description TEXT NOT NULL,
     category VARCHAR(191) NOT NULL,
     unread BOOLEAN NOT NULL DEFAULT TRUE
    );
    
    use sbcntrapp;
    
    INSERT INTO Item (name, title, favorite, img, createdAt, updatedAt)
    VALUES 
      ('Flower', 'Flower', true, '/flower-park.jpeg', NOW(), NOW()),
      ('Apple', 'My apple', false, '/apple.jpeg', NOW(), NOW()),
      ('Goods', 'My goods', false, '/goods.jpeg', NOW(), NOW()),
      ('Dice', 'Cool dices', true, '/dice.jpeg', NOW(), NOW()),
      ('Darts', 'Antique darts board', false, '/darts.jpeg', NOW(), NOW())
      ;
    INSERT INTO Notification (title, description, category, unread, createdAt, updatedAt)
    VALUES 
      ('通知1', 'コンテナアプリケーションの作成の時間です。', 'information', true, NOW(), NOW()),
      ('通知2', 'コンテナアプリケーションの作成の時間です。', 'information', true, NOW(), NOW())
      ;

   ```
# 時間かけるとコストがかかる問題に対処する
### そこそこコストがかかる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122840/75a28d6b-4895-4d40-9d5e-72f79f89704c.png)
主にかかるコストは以下。一日7$くらいかかる。。。
* ec2インスタンス
* VPCエンドポイント（interface）
* ロードバランサー
* ECSクラスタ
### 対処方法
* ec2インスタンス
-> 普通に止めておくだけ
* VPCエンドポイント（interface）
-> 停止の概念がないので、formar2を使ってcloudformation templateにしておく
* ロードバランサー
-> 停止の概念がないので、formar2を使ってcloudformation templateにしておく
* ECS
-> ECSサービスの起動するタスクをゼロにする（backend）。frontendはタスクを直接作成しているはずなので、タスクを落とす。
### formar2とは
以下記事を参考にローカル環境でdockerを立ち上げWEB画面から操作するのみ。途中IAMロール・ユーザを作成する必要があるが、この記事の通りに進めれば大丈夫。formar2の画面でリージョンを選択する必要があるのではまらないように気を付けて。
https://qiita.com/y_inoue15/items/26c245c9e9fdf42c75a4
# アプリが0.0.0.0で全開放が怖い問題
普通にセキュリティグループのIngressから既存のレコードを削除し、MyIPで登録しなおすのみ。画面からでOK。