ハンズオン(AWS) - slcsol4/wyn-wiki GitHub Wiki

準備

やること

  • ハンズオン(アプリケーション編)でここに作成したプロダクトの動作環境をAWSに構築する

到達点

  • AWS構成図の構成を構築する
  • 構築したAWSの環境に前回のハンズオンで作成したプロダクトをデプロイ・動作できるようにする

作成済みの構成について解説

  • フロントエンド:S3
  • バックエンド:EC2,RDS
  • VPCについて
  • セキュリティ
  • 現構成の弱点について

EC2作成

  • AMIからの作成
    • AMIカタログ
      • 自分のAMI
      • 所有者>自分と共有をチェック
      • AMI_ESS_230130を選択
  • 設定
    • 名前
      wyn-ap-名前
    • インスタンスタイプ
      t2-micro
    • キーペア
      • 新しいキーペアの作成
      • キーペア名(下記以外はデフォルト)
        wyn-api-名前-key
    • ネットワーク
      • デフォルト(wyn-vpc)
    • ファイアウォール
      • 既存のセキュリティグループを選択する
      • wyn-sec-groupを選択
      • デフォルト
  • セキュリティグループを編集
    • wyn-sec-groupを編集
    • 一つ目(自身のクライアントからSSHで接続できるようにするため)
      • タイプ:すべてのTCP(本当は必要なプロトコルに絞るべきですが、今回は楽するためにすべてのTCPにしています)
      • ソース:マイIP
      • 説明:client
    • 二つ目(EC2-RDSの疎通のため)
      • タイプ:すべてのTCP(本当は必要なプロトコルに絞るべきですが、今回は楽するためにすべてのTCPにしています)
      • ソース:作成したEC2のプライベートIPv4アドレス
      • 説明:wyn-ap-名前
  • 接続して動作確認
    • 先ほどのKeyPairが必要
    • ログイン方法
      • Teraterm起動
      • ホストにEC2のパブリックDNSを入力(ネットワーキングからコピーできる)
        • OKをクリック
      • ユーザー名:ec2-user
      • パスワード:空白
      • 認証方式
        • RSA/DFA/~を使う
        • ファイル選択で、先ほど作成したKeyPairファイルを選択(ダウンロードされているはず)

RDS作成

  • 標準作成
  • エンジンのオプション
    • エンジンタイプ:AmazonAurora
    • エディション:MySQL互換エディション
    • テンプレート:開発/テスト
  • 設定
    • DBクラスター識別子:wyn-db-名前
    • マスターユーザー名:root
    • マスターパスワード:任意(だけど、今回は同じにしておきましょう)
  • インスタンスの設定
    • バースト可能クラス
      • db.t3.small
  • 可用性と耐久性
    • Auroraレプリカを作成しない(ハンズオンなので)
  • 接続
    • EC2コンピューティングリソースへの接続をしない
    • VPC:wyn-vpc(Default)
    • DBサブネットグループ:Default
    • パブリックアクセス:なし
    • VPCセキュリティグループ:wyn-sec-group
  • 他はすべてDefault
  • ちょっと立ち上がるのに時間がかかるので、動作確認はあとで

S3

  • バケットを作成
    • バケット名:wyn-s3-名前
    • 他:すべてDefault
  • 作成後の設定
    • プロパティ
      • 静的ウェブサイトホスティング:有効
    • アクセス許可
      • バケットポリシーを編集し、以下を設定
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::自身のバケット名に変更/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "自身のグローバルIPアドレスに変更/32"
                    ]
                }
            }
        }
    ]
}

各種資産デプロイ

DB資産

  • 以下、各RDSに接続しアプリケーションが利用するDB環境を構築する手順
  • 設定をEC2(Windows)から行うが、同時に1名しか実施できないので、代表者が実施
  • DBeaver起動し、新たな接続を作成
  • RDSのインスタンスより、エンドポイント名称をコピーして、ホスト名にはりつけ
  • パスワードは任意設定したもの
  • 新規DB:sol4dbを作成
  • 以下SQLを実行
CREATE TABLE t_task(
    task_id       BIGINT   AUTO_INCREMENT comment '課題ID',
    title                 TEXT comment 'タイトル',
    detail              TEXT comment '内容',
    occurred_date          DATE comment '発生日',
    fixed_date          DATE comment '完了日',
    counter_measure          TEXT comment '対策',
    state_value          VARCHAR(1) comment '状態 0:発生 1:着手 2:完了',
    PRIMARY KEY(task_id)
);

INSERT INTO t_task (title,detail,occurred_date,fixed_date,counter_measure,state_value) VALUES('課題タイトル1', '課題内容1', '2022-11-1', '2023-11-1', '課題への対策1', '0');
INSERT INTO t_task (title,detail,occurred_date,fixed_date,counter_measure,state_value) VALUES('課題タイトル2', '課題内容2', '2022-11-2', '2023-11-2', '課題への対策2', '1');
INSERT INTO t_task (title,detail,occurred_date,fixed_date,counter_measure,state_value) VALUES('課題タイトル3', '課題内容3', '2022-11-3', '2023-11-3', '課題への対策3', '2');
INSERT INTO t_task (title,detail,occurred_date,fixed_date,counter_measure,state_value) VALUES('課題タイトル4', '課題内容4', '2022-11-4', '2023-11-4', '課題への対策4', '0');
INSERT INTO t_task (title,detail,occurred_date,fixed_date,counter_measure,state_value) VALUES('課題タイトル5', '課題内容5', '2022-11-5', '2023-11-5', '課題への対策5', '1');
INSERT INTO t_task (title,detail,occurred_date,fixed_date,counter_measure,state_value) VALUES('課題タイトル6', '課題内容6', '2022-11-6', '2023-11-6', '課題への対策6', '2');
INSERT INTO t_task (title,detail,occurred_date,fixed_date,counter_measure,state_value) VALUES('課題タイトル7', '課題内容7', '2022-11-7', '2023-11-7', '課題への対策7', '0');
INSERT INTO t_task (title,detail,occurred_date,fixed_date,counter_measure,state_value) VALUES('課題タイトル8', '課題内容8', '2022-11-8', '2023-11-8', '課題への対策8', '1');
INSERT INTO t_task (title,detail,occurred_date,fixed_date,counter_measure,state_value) VALUES('課題タイトル9', '課題内容9', '2022-11-9', '2023-11-9', '課題への対策9', '2');
INSERT INTO t_task (title,detail,occurred_date,fixed_date,counter_measure,state_value) VALUES('課題タイトル10', '課題内容10', '2022-11-10', '2023-11-10', '課題への対策10', '0');
INSERT INTO t_task (title,detail,occurred_date,fixed_date,counter_measure,state_value) VALUES('課題タイトル11', '課題内容11', '2022-11-11', '2023-11-11', '課題への対策11', '1');

CREATE TABLE t_task_comment(
    comment_id       BIGINT   AUTO_INCREMENT comment 'コメントID',
    task_id       BIGINT   comment '課題ID',
    detail                 TEXT comment '内容',
    post_date              DATE comment '投稿日',
    edit_date          DATE comment '編集日',
    create_person_id          VARCHAR(10) comment '投稿者',
    PRIMARY KEY(comment_id)
);
INSERT INTO t_task_comment (task_id,detail,post_date,edit_date,create_person_id) VALUES(1,'コメントの内容です1','2022-11-1','2023-11-1','198375');
INSERT INTO t_task_comment (task_id,detail,post_date,edit_date,create_person_id) VALUES(1,'コメントの内容です2','2022-11-2','2023-11-2','198375');
INSERT INTO t_task_comment (task_id,detail,post_date,edit_date,create_person_id) VALUES(1,'コメントの内容です3','2022-11-3','2023-11-3','198375');
INSERT INTO t_task_comment (task_id,detail,post_date,edit_date,create_person_id) VALUES(1,'コメントの内容です4','2022-11-4','2023-11-4','198375');
INSERT INTO t_task_comment (task_id,detail,post_date,edit_date,create_person_id) VALUES(1,'コメントの内容です5','2022-11-5','2023-11-5','198375');
INSERT INTO t_task_comment (task_id,detail,post_date,edit_date,create_person_id) VALUES(1,'コメントの内容です6','2022-11-6','2023-11-6','198375');
INSERT INTO t_task_comment (task_id,detail,post_date,edit_date,create_person_id) VALUES(1,'コメントの内容です7','2022-11-7','2023-11-7','198375');
INSERT INTO t_task_comment (task_id,detail,post_date,edit_date,create_person_id) VALUES(1,'コメントの内容です8','2022-11-8','2023-11-8','198375');
INSERT INTO t_task_comment (task_id,detail,post_date,edit_date,create_person_id) VALUES(1,'コメントの内容です9','2022-11-9','2023-11-9','198375');
INSERT INTO t_task_comment (task_id,detail,post_date,edit_date,create_person_id) VALUES(1,'コメントの内容です10','2022-11-10','2023-11-10','198375');
INSERT INTO t_task_comment (task_id,detail,post_date,edit_date,create_person_id) VALUES(1,'コメントの内容です11','2022-11-11','2023-11-11','198375');
INSERT INTO t_task_comment (task_id,detail,post_date,edit_date,create_person_id) VALUES(1,'コメントの内容です12','2022-11-12','2023-11-12','198375');
INSERT INTO t_task_comment (task_id,detail,post_date,edit_date,create_person_id) VALUES(1,'コメントの内容です13','2022-11-13','2023-11-13','198375');
INSERT INTO t_task_comment (task_id,detail,post_date,edit_date,create_person_id) VALUES(2,'コメントの内容です14','2022-11-14','2023-11-14','198375');
INSERT INTO t_task_comment (task_id,detail,post_date,edit_date,create_person_id) VALUES(2,'コメントの内容です15','2022-11-15','2023-11-15','198375');
INSERT INTO t_task_comment (task_id,detail,post_date,edit_date,create_person_id) VALUES(2,'コメントの内容です16','2022-11-16','2023-11-16','198375');
INSERT INTO t_task_comment (task_id,detail,post_date,edit_date,create_person_id) VALUES(3,'コメントの内容です17','2022-11-17','2023-11-17','198375');
INSERT INTO t_task_comment (task_id,detail,post_date,edit_date,create_person_id) VALUES(3,'コメントの内容です18','2022-11-18','2023-11-18','198375');
INSERT INTO t_task_comment (task_id,detail,post_date,edit_date,create_person_id) VALUES(4,'コメントの内容です19','2022-11-19','2023-11-19','198375');
INSERT INTO t_task_comment (task_id,detail,post_date,edit_date,create_person_id) VALUES(5,'コメントの内容です20','2022-11-20','2023-11-20','198375');

バックエンドAPI

  • この手順は、前回のハンズオン(アプリケーション)で使用した端末で実施
  • InteliJを起動し、wyn-apiを開く(c:\product\wyn-api)
  • ブランチが前回のハンズオンで利用していた個別ブランチになっていることを確認
  • DB接続先の編集
    • 編集ファイル:src\main\resources
    • application.properties:local⇒devに変更
    • application-dev.properties
spring.datasource.url=jdbc:mysql://編集!作成したRDSのエンドポイント:3306/sol4db?enabledTLSProtocols=TLSv1.2&characterEncoding=SJIS
spring.datasource.username=root
spring.datasource.password=編集!パスワード
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.initialization-mode=always
spring.datasource.schema=
spring.datasource.data=
spring.datasource.sql-script-encoding=utf-8
spring.jpa.hibernate.ddl-auto=update
mybatis.mapUnderscoreToCamelCase=true

  • ビルド
    • Gradleパネルから、Tasks>build>buildを実行
  • プロジェクトルート\build\libs\を確認
    • sol4-0.0.1-SNAPSHOT.jarができているはず
  • デプロイ
    • 上記ファイルをSlackを介して、AWS環境にもってくる
    • TeratermでAPサーバに接続し、serverフォルダの直下に配置
    • 以下コマンドを実行し、API起動
sudo java -jar sol4-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev

UIデプロイ

  • この手順は、前回のハンズオン(アプリケーション)で使用した端末で実施
  • VSCodeを起動し、wyn-uiを開く(c:\product\wyn-ui)
  • ブランチが前回のハンズオンで利用していた個別ブランチになっていることを確認
  • APIの向き先編集
    • 編集ファイル:.env:localhost⇒作成したEC2のパブリックIPv4アドレス(ポートは8080)
    • 編集ファイル2:.env.development:localhost⇒作成したEC2のパブリックIPv4アドレス(ポートは8080)
      • .env.developmentの編集は実は不要(build時にdev指定でbuildすることで接続先を切り替えられるようにするためのファイルであるため)
  • ビルド
    • ターミナルを開き、以下コマンドを実行
npm run build
  • プロジェクトフォルダ直下に「dist」フォルダができる
  • デプロイ
    • 上記ファイルをSlackを介して、AWS環境にもってくる
    • マネジメントコンソールから、S3の作成したバケットにアップロード

動作確認

  • S3のバケット>プロパティの最下部にアクセス用のURLがあるので、クリックして、作成したアプリケーションが動作していることを確認する

追加

  • APIをバックグラウンドで実行
    • 今の起動方法だとTeratermの接続がきれるとバックエンドが停止するようになっている
    • viコマンドでserver\server_start_dev.shを編集
      • api-0.0.1-SNAPSHOT.jarになっている箇所をsol4-0.0.1-SNAPSHOT.jarに変更
      • server\server_start_dev.shを実行すると、バックグラウンドで起動してくれる(停止は同フォルダのserver_stop.sh)

お片付け

  • 複数の環境は不要なので、今回ハンズオンで作成したインスタンスはすべて削除する
    • S3:バケット削除
    • RDS:インスタンス削除
    • EC2:インスタンス削除
    • セキュリティグループ:EC2のプライベートアドレス削除