【AWS】CloudFormation을 통한 웹 서비스 구축 ③(RDS편)

1. 시작
본 투고는 아래 보도의 속편이다.
【AWS】CloudFormation을 통한 웹 서비스 구축①(NW편)
【AWS】CloudFormation을 통한 웹 서비스 구축 ②(EC2편)
이 투고를 처음 보신 분은 이쪽 기사부터 읽어주세요.
2. RDS 편 개요
이번'AWS'클라우드 포메이션은 웹 서비스 ③(RDS편)를 구축하고 웹 서비스의 데이터 관리를 목적으로 하는 데이터베이스 관리 시스템, 아마존 RDS의 템플릿을 제작한다.
구체적인 서비스는 다음과 같다.
2.1 "Database.yml"에 등장하는 서비스
  • Amazon RDS
  • DB 엔진: MySQL
  • 서브넷 그룹
  • 매개 변수 그룹
  • 기타 [상세 설정]
  • 2.2 RDS 편 구성도
    RDS 편이 작성한 템플릿 환경의 구성도는 다음 그림과 같습니다.

    3. RDS 템플릿 만들기
    다음은 RDS 섹션의 템플릿입니다.
    명명 규칙 등 필요하면 자신의 환경에 따라 수정하세요.
    수정이 완료되면 작업 디렉터리에 '데이터베이스.yml' 파일 이름으로 저장하십시오.
    database.yml
    AWSTemplateFormatVersion: "2010-09-09"
    Description: Web2tier-database-Template
    
    
    # ------------------------------------------------------------#
    # Input Parameters
    # ------------------------------------------------------------# 
    Parameters:
    ### Project Prefix ###
      PJPrefix:
        Type: String
    ### RDS Name ###
      DBEngineName:
        Type: String
        Default: "web2tier-rds-mysql"
    ### RDS Database type & Major version ###
      MySQLMajorVersion:
        Type: String
        Default: "5.7"
        AllowedValues: [ "5.5", "5.6", "5.7" ]
    ### RDS Database type & Minor version ###
      MySQLMinorVersion:
        Type: String
        Default: "22"
    ### Instnce Options ###
      DBInstanceClass:
        Type: String
        Default: "db.m4.large" 
      DBEngineStorageSize:
        Type: String
        Default: "30"
      DBEngineStorageType:
        Type: String
        Default: "gp2"
    ### Database name ###
      DBName:
        Type: String
        Default: "testdb"
    ### User Options ###
      DBMasterUserName:
        Type: String
        Default: "dbuser"
        NoEcho: true
        MinLength: 1
        MaxLength: 16
        AllowedPattern: "[a-zA-Z][a-zA-Z0-9]*"
        ConstraintDescription: "must begin with a letter and contain only alphanumeric characters."
      DBPassword: 
        Default: "DBPassword"
        NoEcho: true
        Type: String
        MinLength: 8
        MaxLength: 41
        AllowedPattern: "[a-zA-Z0-9]*"
        ConstraintDescription: "must contain only alphanumeric characters."
    ### AZ options ###
      MultiAZ: 
        Default: "false"
        Type: String
        AllowedValues: [ "true", "false" ]
    
    
    ### Resources ###
    Resources: 
    # ------------------------------------------------------------#
    #  DB - Engine
    # ------------------------------------------------------------#
      DBEngine: 
        Type: "AWS::RDS::DBInstance"
        Properties: 
          DBInstanceIdentifier: !Sub "${DBEngineName}"
          Engine: MySQL
          EngineVersion: !Sub "${MySQLMajorVersion}.${MySQLMinorVersion}"
          DBInstanceClass: !Ref DBInstanceClass
          AllocatedStorage: !Ref DBEngineStorageSize
          StorageType: !Ref DBEngineStorageType
          DBName: !Ref DBName
          MasterUsername: !Ref DBMasterUserName
          MasterUserPassword: !Ref DBPassword
          DBSubnetGroupName: !Ref DBSubnetGroup
          PubliclyAccessible: false
          MultiAZ: !Ref MultiAZ
          PreferredBackupWindow: "18:00-18:30"
          PreferredMaintenanceWindow: "sat:19:00-sat:19:30"
          AutoMinorVersionUpgrade: false
          DBParameterGroupName: !Ref DBParameterGroup  
          VPCSecurityGroups:
            - { "Fn::ImportValue": !Sub "${PJPrefix}-rds-sg" }
          CopyTagsToSnapshot: true
          BackupRetentionPeriod: 7
          Tags: 
            - Key: "Name"
              Value: !Ref DBEngineName
        DeletionPolicy: "Delete"
    
    
    # ------------------------------------------------------------#
    #  DB - SubnetGroup
    # ------------------------------------------------------------#
      DBSubnetGroup: 
        Type: "AWS::RDS::DBSubnetGroup"
        Properties: 
          DBSubnetGroupName: !Sub "${DBEngineName}-subnet"
          DBSubnetGroupDescription: "-"
          SubnetIds: 
            - { "Fn::ImportValue": !Sub "${PJPrefix}-private-subnet-a" }
            - { "Fn::ImportValue": !Sub "${PJPrefix}-private-subnet-c" }
    
    
    # ------------------------------------------------------------#
    #  DB - ParameterGroup
    # ------------------------------------------------------------#
      DBParameterGroup:
        Type: "AWS::RDS::DBParameterGroup"
        Properties:
          Family: !Sub "MySQL${MySQLMajorVersion}"
          Description: !Sub "${DBEngineName}-parm"
    
    3.1 RDS 템플릿 구축
    작성된 CFn 템플릿의 구성
    다음 명령을 실행하십시오.
    ※ 스택 이름, 접두사, 또는 추가로 지정하려는 매개 변수 등이 있으면 자신의 환경에 따라 수정하십시오.
    RDS 템플릿 구성 명령
    $ aws cloudformation create-stack \
    --stack-name web2tier-RDS-stack \
    --template-body file://./databse.yml \
    --parameters ParameterKey=PJPrefix,ParameterValue=web2tier
    
    ↓ 문법 오류가 없으면 다음 결과를 출력합니다.
    실행 결과
    {
        "StackId": "arn:aws:cloudformation:ap-northeast-1:xxxxxxx:stack/<スタックネーム>/<メタ番号>"
    }
    
    3.2 SSM을 사용한 Apache와 MySQL(RDS) 협업
    지금까지의 단계는 웹 서비스의 기초 환경을 구축했다.
    이후 마지막 완성요건인'RDS를 통해 작성된 DB 기록의 브라우저 열람'을 달성하기 위해 아파치와 RDS 합동 작업을 진행한다.
    작업은 다음 절차에 따라 진행된다.
    ① SSM을 통해 웹 서버에 연결
    ② MySQL(RDS)에 웹 서버 연결
    ③ 테스트 기록 작성
    ④ 웹 서버에서 MySQL과 공동 작업 설정
    그럼 바로 일을 시작하겠습니다.
    3.2.1 세션 관리자를 통해 SSM과 웹 서버에 연결
    Amazon Systems Manager의 세션 관리자 기능을 사용하여 웹 서버에 연결하여 콘솔 작업을 수행합니다.
    ※ 연결 대상 웹 서버는 AZ-a, c 중 임의
    자세한 순서는 생략하겠습니다. 하지만 Google 등과 AWS SSM EC2 연결 연결로 검색하면 순서가 기재된 기사가 많기 때문에 그쪽을 참조하십시오.
    3.2.2 MySQL에 연결
    웹 서버를 기준으로 MySQL에 연결합니다.
    세션 관리자가 웹 서버에 연결된 상태인 것 같습니다. 콘솔에서 다음 절차를 수행하십시오.
    # DB操作の為のMySQLをインストール
    $ sudo yum -y install mysql
    
    # WebサーバーのMySQLクライアントからRDSに接続
    # ※下記コマンド実行後、パスワードを聞かれますので、RDS作成時に設定したパスワードを入力してください
    $ mysql -h <RDSのエンドポイント> -P 3306 -u <ユーザー名> -p
    
    ↓ 연결 후 아래와 같이 힌트를 주면 MySQL 연결이 완료됩니다
    mysql [{none}]> 
    
    3.2.3 테스트 기록의 제작
    MySQL에서 브라우저에 표시할 테스트 레코드를 만듭니다.
    손 순서대로 실행하세요.
    # テスト用のデータベースの作成
    mysql [{none}]> create database testdb;
    
    # テーブルの作成(テーブル名:user)
    mysql [{none}]> create table testdb.user(id int , country varchar(20));
    
    # 作成したテーブルにデータを挿入
    mysql [{none}]> INSERT INTO testdb.user
      (id, country)
    VALUES 
      (1, 'Japan'),
      (2, 'Argentina'),
      (3, 'Italy'),
      (4, 'India'),
      (5, 'Australia'),
      (6, 'Czech'),
      (7, 'Portugal'),
      (8, 'Mongolia'),
      (9, 'Germany'),
      (10, 'Belgium');
    
    # データが登録できたことを確認する
    mysql [{none}]> select * from testdb.user;
    
    # MySQLから抜ける
    mysql [{none}]> quit
    
    3.2.4 웹 서버에서 PHP와 MySQL의 공동 작업 설정
    웹 서버의 브라우저에서 방금 작성한 테스트 레코드를 표시하기 위한 설정을 수행합니다.
    PHP를 재설치하고 MySQL과 공동 작업을 위한 설정 파일을 수정합니다.
    마찬가지로 명령줄에서 다음 절차를 수행하십시오.
    참고: 이 프로그램을 두 개의 웹 서버(ZA-a, AZ-C)에 구현하십시오.
    ① 웹 서버에 PHP 및 MySQL 처리 모듈 설치
    $ sudo yum -y install php php-mysql
    
    ② 확장자.php 파일을 php 파일로 읽기 설정하기
    vim 편집기에서 httpd.conf 열기
    $ sudo vim /etc/httpd/conf/httpd.conf
    
    IfModule mime module로 표시된 영역에 다음 코드를 추가합니다.
    코드: AddType application/x-httpd-php.php
    httpd.conf- 편집 전
    <IfModule mime_module>
    ~~ 略 ~~
    </IfModule>
    
    ↓ 영역의 끝에 있는 코드: AddType application/x-httpd-php.추기 php
    httpd.conf- 편집 후
    <IfModule mime_module>
    ~~ 略 ~~
    AddType application/x-httpd-php .php
    </IfModule>
    
    그런 다음 Apache를 다시 시작하고 구성 파일을 다시 로드합니다.
    다음 명령을 실행하십시오.
    $ sudo systemctl restart httpd
    
    ③ 아파치에서 PHP를 읽는지 확인
    PHP 버전 정보 indexphp에서 추기를 실행하여 브라우저에서 이 버전의 정보를 열람할 수 있는지 확인합니다.
    다음 명령을 실행하십시오.
    $  sudo sh -c "echo '<?php phpinfo(); ?>' >> /var/www/html/index.php"
    
    브라우저에서 다음 URL을 사용하여 검색합니다.
    URL: www.<도메인 이름>/index.php
    아래 화면이 표시되면 PHP가 쉽게 읽을 수 있습니다.

    ④ index.php를 DB 정보를 참조하는 코드로 수정
    아까 index.php에 추가되었습니다. 이번에는 RDS에서 만들어지고 DB 기록을 참조한 코드를 기록합니다.
    비디오 편집기의 index입니다.php 파일을 시작합니다.
    $ sudo vim /var/www/html/index.php
    
    다음 코드는 index입니다.php에 붙여 주세요.
    <>에 둘러싸인 다음 부분을 수정하십시오.

    ・<사용자 이름>
    암호
    <?php
    try
    {
    $dbs = "mysql:host=<RDSのエンドポイント>;dbname=testdb;charset=utf8";
    $user='<ユーザー名>';
    $password='<パスワード>';
    $dbh=new PDO($dbs, $user, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $sql='SELECT * FROM user';
    $stmt=$dbh->prepare($sql);
    
    $dbh=null;
    //実行
    $stmt->execute();
    
    $all = $stmt->fetchAll();
    //配列を表示
    foreach($all as $loop){
      echo $loop['id']." ".$loop['country'].'<br>';
    }
    
    }
    catch (Exception $e)
    {
            print '接続失敗';
            exit();
    }
    ?>
    
    Apache를 아까처럼 다시 시작하고 구성 파일을 다시 로드합니다.
    다음 명령을 실행하십시오.
    $ sudo systemctl restart httpd
    
    4. 동작 확인 - RDS를 통한 DB 레코드 찾아보기
    그러면 마지막 남은 완성 조건[RDS를 통해 제작된 DB 기록의 브라우저 조회]을 확인하는 동작입니다.
    브라우저에서 다음 URL을 사용하여 검색합니다.
    URL: www.<도메인 이름>/index.php
    RDS에서 작성한 DB 테이블이 표시되는지 확인합니다.

    5. 요약
    이상, 본 보도는 모두 끝났습니다.
    CFn과 최소한의 수동 조작을 통해 웹 서버 제작을 간단하게 끝냈다.
    또한 이번 편에서 공개한 CFn 코드에는 최소한의 코드만 기재되어 있다.
    여기에 소개되지 않은 삽입식 함수와 문법은 CFn에도 많다.
    어쨌든 이 기사가 CFn에 관심을 가질 수 있는 좋은 기회가 됐으면 좋겠습니다.
    - 기사 목록 -
    ①[AWS] 클라우드 포메이션을 통한 웹 서비스 구축 ①(NW편)
    ②[AWS] 클라우드 포메이션을 통한 웹 서비스 구축 ②(EC2편)
    ③[AWS] 클라우드 포메이션을 통한 웹 서비스 구축 ③(RDS편)

    좋은 웹페이지 즐겨찾기