AWSにおけるLAMP環境構築(CloudFormation編)

こんにちは。issaです。
まさかの3週連続登場となりました!
せっかくなので、引き続きAWSネタで攻めてみたいと思います。

前回までは、手動で設定していきましたので
どういったものを利用して設定しているかの理解を深められたかと思います。
今回はそれを自動で作成してしまおうという試みです。

最速で前回と同じEC2 1台RDS1台の環境を構築したい人は、事前にログイン時の共有キーを作成した後
こちらのコードをテンプレート保存して実行してください!
ものの10分ほどで環境ができあがってるはずです!利用する前に、セキュリティ設定の見直しだけはお忘れなく。
※サンプルコードでは共有キー名を「testSampleKey」としていますので合わせるかコードの設定を変更してご利用ください。
 キーペア作成の詳細はこちら。


それ以外の方は、一緒に順を追って構築していきましょう。

構成図

それでは、CloudFormationネタということでいきなりこちらのページへ来られた方のために、まずは構成図をご覧ください。

サーバー構成としては前回と同じ下記となります。

ネットワーク構成は下記設定でおこなっていきます。

VPC:192.168.0.0/16
サブネット1:192.168.10.0/24 (AvailabilityZone: ap-northeast-1a)
サブネット2:192.168.20.0/24 (AvailabilityZone: ap-northeast-1c)
WEBサーバーIP:192.168.10.10
WEBサーバーアクセス許可IP, ポート:192.168.0.1, 22ポート,80ポート

※「WEBサーバーアクセス許可IP」は仮にローカルIPを指定していますが、ご自分の環境のグローバルIPへと読み替えてください。
DBサーバーアクセス許可IP, ポート:192.168.10.10, 3306ポート

インスタンス設定自体は2か所でしたが、実際にはこの図のようにデフォルト設定で利用していたVPCやサブネット等のネットワーク設定が含まれていたのですね!

CloudFormation Designerツール

CloudFormationを利用するにあたり、今回は下記コードをテンプレートとして登録してみましょう。まずはツールを起動していきます。

①「サービス」をクリックし、全項目を表示。
②「管理ツール」より、「CloudFormation」をクリック。

①「テンプレートをデザイン」ボタンをクリック。

ツールが開きましたか?
一から作成する際には、画面左の「リソースタイプ」から各サービスを選択して設定していくことになります。
今回は、こちらのコードを下部のエディタへ張り付け、それを図に反映してみましょう。

①「テンプレート」タブをクリック。
②今回はYAML形式でサンプルを用意していますので「YAML」をクリックし。
③テキストエリアへコードを貼り付けます。

①貼り付けが終わりましたら、Designerツールがコードと図があっていない旨のメッセージが表示されています。
②「リフレッシュ」ボタンをクリックして、コードと同期させてください。

図のような感じで表示されましたでしょうか。
①見づらい場合は「ウィンドウに合わせる」ボタンがありますのでこちらをクリック。

①コンポーネントをクリックすると
②該当するコードがハイライトされます。
 設定の追加や変更はコードから探さなくとも、ここから可能です。

下記をおこなうことにより、コンポーネント毎の設定も閲覧・編集可能です。
①「コンポーネント」タブをクリック。
②「コンポーネント」のアイコンをクリック。

コード説明

それでは、部分的に見ていきましょう。

CloudFormationのDesignerツール用設定

2行目から171行目まではCloudFormationのDesignerツールで図示するための設定パラメーターとなります。ツールで「コンポーネント」のアイコンを移動したりすると、自動的に変更してくれます。
また、コード中の

    Metadata:
      'AWS::CloudFormation::Designer':
        id: xxxxxxxxxxxxxxxx

となっているか所に関しても同様です。
こちらで意識する必要はありません。

Resources以下が、各コンポーネントへの設定値になっていきます。
今回の場合、大きく分けると下記3パートに分けて記載しています。
サンプルコードへは、下記と同じ名称でコメントを入れています。

ネットワーク設定

それでは、コード内にコメントで説明していきます。
なお、Metadataは自動設定ですから削除しています。

  TestVPC:
    Type: 'AWS::EC2::VPC'
    Properties:
      CidrBlock: 192.168.0.0/16
  TestInternetGateway:
    Type: 'AWS::EC2::InternetGateway'
    Properties: {}
  TestVPCGatewayAttachment:
    Type: 'AWS::EC2::VPCGatewayAttachment'
    Properties:
      VpcId: !Ref TestVPC
      InternetGatewayId: !Ref TestInternetGateway
  TestSubnet1:
    Type: 'AWS::EC2::Subnet'
    Properties:
      VpcId: !Ref TestVPC
      AvailabilityZone: ap-northeast-1a
      CidrBlock: 192.168.10.0/24
  TestSubnet2:
    Type: 'AWS::EC2::Subnet'
    Properties:
      VpcId: !Ref TestVPC
      AvailabilityZone: ap-northeast-1c
      CidrBlock: 192.168.20.0/24
  TestDBSubnetGroup:
    Type: 'AWS::RDS::DBSubnetGroup'
    Properties:
      SubnetIds:
        - !Ref TestSubnet1
        - !Ref TestSubnet2
      DBSubnetGroupDescription: testDBSubnetGroup
  TestRouteTable:
    Type: 'AWS::EC2::RouteTable'
    Properties:
      VpcId: !Ref TestVPC
  TestRoute:
    Type: 'AWS::EC2::Route'
    Properties:
      DestinationCidrBlock: 0.0.0.0/0
      RouteTableId: !Ref TestRouteTable
      GatewayId: !Ref TestInternetGateway
  TestSubnetRouteTableAssociation:
    Type: 'AWS::EC2::SubnetRouteTableAssociation'
    Properties:
      RouteTableId: !Ref TestRouteTable
      SubnetId: !Ref TestSubnet1

このパートでは、外部通信やEC2とRDS相互の通信に必要となる下記が設定されています。

  • VPC
  • InternetGateway
  • RouteTable
  • ap-northeast-1aゾーン用サブネット
  • ap-northeast-1cゾーン用サブネット
  • RDS用サブネットグループ

ここに、WEBサーバーやDBサーバーを接続することにより通信が可能になります。
設定可能なプロパティに関しては、下記URLを参照ください。
今回は必須項目とIP以外はデフォルト設定を踏襲しています。

WEBサーバー設定

基本的には、前回と同様の設定となります。
こちらは、個別に設定している項目も多いのでインラインのコメントで解説していきます。

# WEBサーバー設定
  ## セキュリティグループの設定をしていきます。
  TestSecurityGroup:
    Type: 'AWS::EC2::SecurityGroup'
    Properties:
      VpcId: !Ref TestVPC
      GroupDescription: ownIpAddressGroup
      ## ここで、セキュリティ設定を行なっています。
      ## 192.168.0.1の箇所を許可したいIPに変更してください。
      ## Portは許可したいポートに対してのレンジ指定です。送信元と送信先ではありません。
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: '22'
          ToPort: '22'
          CidrIp: 192.168.0.1/32
        - IpProtocol: tcp
          FromPort: '80'
          ToPort: '80'
          CidrIp: 192.168.0.1/32

  ## ここからがEC2インスタンスの設定になります。
  TestWebServer1:
    Type: 'AWS::EC2::Instance'
    Properties:
      ## 今回は無料で利用可能なt2.microインスタンスを指定しています。
      InstanceType: t2.micro
      ## アベイラビリティゾーンを東京のa側に指定しています。
      AvailabilityZone: ap-northeast-1a
      ## 前回と同じRedHatのAMI IDです。このIDは予めAMIを作成しておいたものを利用しても良いですし、AWS Marketplaceから選択してもかまいません。
      ImageId: ami-eb50cd8d
      ## コンソールログイン時に使用するキーの名称です。予め用意してダウンロードしておきましょう。
      KeyName: testSampleKey
      ## HDDの指定です。VolumeSizeの単位はGBです。
      BlockDeviceMappings:
        - DeviceName: /dev/sda1
          Ebs:
            VolumeSize: 15
      ## NIC情報を指定します。
      ## 今回は、動的パブリックIPを自動付与にして
      ## プライベートIDとして192.168.10.10を設定しています。
      ## 属するサブネットと同じ帯域で設定しましょう。
      NetworkInterfaces:
        - AssociatePublicIpAddress: true
          SubnetId: !Ref TestSubnet1
          DeleteOnTermination: true
          PrivateIpAddress: 192.168.10.10
          DeviceIndex: '0'
          GroupSet:
            - !Ref TestSecurityGroup
      ## OSインストール完了後の初期化処理です。
      ## 前回と同様のインストールを自動でやってしまいます!
      ## ここでは、各種インストールからphpinfoの表示ページの配置まで実施しています。
      UserData: !Base64 
        'Fn::Join':
          - ''
          - - |
              #!/bin/bash
            - |
              yum -y remove mariadb-libs
            - |
              yum -y update
            - >
              rpm -ivh
              http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
            - |
              yum -y install mysql httpd
            - >
              yum -y install
              http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm
            - >
              yum -y install
              http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
            - |
              yum -y install --enablerepo=remi-php72 php php-mysql
            - |
              systemctl enable httpd.service
            - |
              systemctl start httpd.service
            - |
              echo ' /var/www/html/info.php
            - |
              echo 'phpinfo();'  >> /var/www/html/info.php
            - |
              setsebool -P httpd_can_network_connect_db on

DBサーバー設定

続いてDBサーバーの設定も見ていきましょう。

  ## パラメータグループを作っておきます。
  ## ここではベースの指定のみですが、各パラメータの設定も可能です。
  TestDBParameterGroup:
    Type: 'AWS::RDS::DBParameterGroup'
    Properties:
      Description: mysql57CustomParameter
      Family: mysql5.7
  ## セキュリティグループの設定です。
  ## 先ほど作成したWEBサーバーのIPアドレスからのみ許可としています。
  TestRdsSecurityGroups:
    Type: 'AWS::EC2::SecurityGroup'
    Properties:
      GroupDescription: RdsSecurityGroup
      SecurityGroupIngress:
        - IpProtocol: tcp
          CidrIp: 192.168.10.10/32
          FromPort: '3306'
          ToPort: '3306'
      VpcId: !Ref TestVPC
  ## DBインスタンスの設定です。
  ## 設定項目は、前回と同様にしています。
  TestDbServer1:
    Type: 'AWS::RDS::DBInstance'
    Properties:
      DBParameterGroupName: !Ref TestDBParameterGroup
      MultiAZ: false
      DBInstanceClass: db.t2.micro
      AllocatedStorage: 20
      StorageType: gp2
      DBInstanceIdentifier: test-hogehoge
      MasterUsername: master_hogehoge
      MasterUserPassword: hogehogepw
      DBName: hogehoge_db
      Engine: mysql
      EngineVersion: 5.7.19
      Port: 3306
      AvailabilityZone: ap-northeast-1a
      VPCSecurityGroups:
        - !Ref TestRdsSecurityGroups
      DBSubnetGroupName: !Ref TestDBSubnetGroup


確認

ある程度コードの内容まで分かったところで、実際にリソースを作って確認していきましょう。

Designerツール操作

①画面左上の「リソースの作成」ボタンをクリック

①「次へ」ボタンをクリック

①適当なスタックの名前を入力してください。
②「次へ」ボタンをクリック。

ここで、誤操作等を考慮してアクセス権限を付与することも可能です。
今回は検証環境のため、特に設定せずに進みます。
①「次へ」ボタンをクリック。


①「作成」ボタンをクリック。

①図のような状態になりましたでしょうか。初期状態から更新されていない場合はこの「更新」ボタンをクリックしてください。
②先ほど作成した名前が確認できます。
③作成中の状況が確認できます。
 ここが「CREATE_COMPLETE」となれば完成です!
 通常は自動で更新されますが、変わらない場合は①の「更新」ボタンをクリックしてください。

完了しましたら、ブラウザーより「http://IPv4 パブリック IP/info.php」へアクセスしてみてください。
図のようにPHPの情報が表示されたら成功です!
※IPアドレスは、EC2のインスタンス一覧より確認してください。

既にPHPからMySQLへの接続も可能ですので、前回の記事を参考にファイルを配置すればそちらの確認ももちろん可能です!

まとめ

いかがでしたでしょうか。
どれが必要なのか。というのが、ネットワーク周りは分かりづらかったかもしれませんが、基本的にはGUIで設定・選択していたものと同じです。
あらかじめデフォルトで設定されていましたので、あらためて前回の設定を確認してみるのも良いかと思います。

全体のコード量としては、それなりの行数になっていましたがコンポーネント単位で見ていくとそれほどでもないことに驚かれるかもしれませんね。頻繁に作成する機会のある環境の方でしたら、ぜひこれを利用して楽しちゃいましょう!

※本番運用時には、もっとしっかりと設定を入れ込みましょう!

AWSにおけるLAMP環境構築(構築編)

前回の記事(事前準備編)で、請求関連までの設定が完了しました。
今回は、各サービスを利用してサーバー自体の環境を構築していきます!

今回は以下の流れでご紹介していきます。

Webサーバー(EC2)

いよいよWebサーバーの準備に入ります。
AWSの場合は色々なサービスがありますが、汎用的に利用できるサーバーを
EC2(Elastic Compute Cloud)と呼んでおり、これを利用します。

インスタンスの作成

①まず、リージョンを確認しましょう。
※AWSでは、サーバーのある国毎にリージョンが設定されています。
AWSは世界中にあるサーバー群から選択して設定することが可能です。
Webサーバー等外部との接続をおこなう場合、より近い方がレスポンス等早くなりますので
なるべくネットワークアクセスが近い国を選択すると良いでしょう。
また、国によって利用料金も異なってきますので用途によっては安い国を選択するのも一つの選択肢です。
国ごとの料金詳細はこちら。

②今回は国内利用を想定していますので「アジアパシフィック (東京)」リージョンを選択します。

①希望のリージョン(今回は東京)が選択されていることが確認できます。
②全てのサービスから「EC2」をクリック。


①「インスタンスの作成」ボタンをクリック。

①今回は無料利用枠の範囲で構築しますので「無料利用枠のみ」をチェック
②好みのOSの「選択」ボタンをクリック。今回はRedHatを選択しました。
③「クイックスタート」にも複数のOSが並んでいますが、CentOS等を選択したい場合もあるかと思います。
その場合は「AWS Marketplace」タブを選択し、検索窓に「CentOS7」等と入力してください。
④Marketplaceでも無料対象にはこちらの画面と同様の「無料利用枠の対象」という表示がありますので、そちらを参考に選択すると良いでしょう。

インスタンスタイプとは、いわゆるマシンスペックです。
適切なスペックを選んでいきましょう。スペックアップ等はサーバーの停止を伴いますので慎重に。
①「無料利用枠の対象」となっている「t2.micro」を選択(初期状態で選択されています)
②「次の手順:インスタンスの詳細の設定」ボタンをクリック。

①1つの環境で、複数のVPCを構成している場合はこちらで対象となるネットワークを選択してください。
初期は他に作成していないので「デフォルト」で問題ありません。
②冗長構成等作成する場合には、適切な「アベイラビリティゾーン」を選択してください。
今回は1台構成のため「デフォルト」で問題ありません。
③本番環境の場合、インスタンスの削除はサービスの停止等のタイミング等限られた場合になると思います。
その場合はこちらを選択して、誤った削除から保護しましょう。
今回は検証環境で削除予定がありますので、チェックはしていません。
④「次の手順:ストレージの追加」ボタンをクリック。

①初期状態では10Gとなっていますが、他にインスタンスを作成する予定がなければ30Gまでは無料範囲で広げられます。
②ストレージの選択が終わったら「次の手順:タグの追加」ボタンをクリック。

目的、所有者、環境などさまざまな方法で分類するためのタグを設定できます。
今回はその他の利用予定がありませんので、そのまま進みます。
①「次の手順:セキュリティグループの設定」ボタンをクリック。

サーバーを運用したことがある方は解ると思いますが、不正アクセスというものは非常に多くあります。
弊社で運用しているサーバーでも、毎日不正アクセスを検知・排除しています。
AWSのセキュリティグループはいわゆるファイアウォールと同等の機能で、サーバーにパケットが到達する前に防いでくれます。
EC2サーバーは立ち上がったと同時に、インターネット上に公開されてしまいます。
まずは最小限の公開範囲とすることで、不正なアクセスをされないようにしておきましょう。

①「新しいセキュリティグループを作成する」を選択。
②名称、説明文を設定。
③「タイプ」のプルダウンより「SSH」を選択。
④「ソース」のプルダウンより「マイIP」を選択。
※固定IPサービスを利用されていない方は「任意の場所」を選択。
⑤「確認と作成」ボタンをクリック。

①表示内容を確認し、問題ないようでしたら「作成」ボタンをクリック。

初回アクセスは、ここで作成するキーを利用してアクセスします。
①「新しいキーペアの作成」を選択。既存のキーがある方は、そちらを設定することも可能です。
②キーペア名を入力します。
③「キーペアのダウンロード」ボタンをクリック。
④キーペアをダウンロードすると「インスタンスの作成」ボタンが活性化されますので、そのままクリック。

インスタンスが作成状態となりました。

①メニューより、「インスタンス」をクリック。
②しばらくすると、図のような起動状態(インスタンスの状態がrunning)となります。
③起動が完了すると、パブリックIPとプライベートIPが決まります。
この情報は後ほど利用しますので、メモ等控えておいてください。

DBサーバー(RDS)

それでは、DBサーバー(RDS)の設定に参りましょう。
いきなりインスタンス作成!と進みたいところですが、事前準備が必要です。

RDS用セキュリティグループ作成

まずはRDS用のセキュリティグループを用意します。
ここで、先ほどのEC2からのみアクセスを許可する設定を用意しておきます。

①EC2ダッシュボードのまま、メニューより「セキュリティグループ」をクリック。
②「セキュリティグループの作成」ボタンをクリック。

①グループ名を記入します。
②EC2と同じVPCを選択してください。
複数のVPCを作成していない場合は、デフォルトで問題ありません。
③「タイプ」のプルダウンより「カスタムTCP」を選択。
④MySQLで利用するポートを指定。MySQLのデフォルトポートは「3306」です。
⑤先ほど作成したEC2の画面で確認した「プライベートIP」を設定。
IPアドレスはCIDR表記で記載する必要があります。
⑥全ての入力が完了したら「作成」ボタンをクリック。

RDSパラメータセット作成

RDSはデフォルトのパラメータセットの内容を変更できません。
また、パラメータグループの付け替えにも再起動が必要になってしまいます。
そのため、あらかじめパラメータグループを作成しておきましょう。

RDSのダッシュボードに移動します。
①左上のサービスをクリックし、一覧を表示。
②「データベース」グループから「RDS」をクリック。

①「RDSダッシュボード」に移動したら「パラメータグループ」をクリック。
②「パラメータグループの作成」ボタンをクリック。

①「パラメータグループファミリー」は多数の選択肢がありますが、
今回作成するのは「mysqlの5.7」ですので、それを選択します。
②「グループ名」と「説明」には、それぞれ分かりやすい名称と説明を入力してください。
③「作成」ボタンをクリック。

RDSインスタンスの作成

ここから、RDSインスタンスの作成に入ります。

RDSインスタンスの作成に入ります。
①メニューより「インスタンス」をクリック。
②「DBインスタンスの起動」ボタンをクリック。

①今回は無料利用枠の範囲で構築しますので「無料利用枠のみの対象」をチェック。
②①でチェックを入れたことにより、対象ではないメッセージが出力されるようになりました。
③「MySQL」タブをクリック

①「選択」ボタンをクリック。

①先ほどパラメータグループで選択したのと同じバージョンを選択してください。
今回は執筆段階の最新である、「mysql 5.7.19」としています。
②適用したいストレージ容量を設定。
20Gまでは無料利用枠です。
③接続に必要な情報を決めて入力します。
④設定が完了したら「次のステップ」ボタンをクリック。

①EC2と同じVPCを選択してください。
②外部から直接アクセスさせる必要はないため、パブリックアクセスはできないようにします。
③ここで、先ほどRDS用に作成したセキュリティグループを選択してください。
④データベースの名前を入力してください。
⑤「DBパラメータグループ」へは、先ほど作成したグループを選択してください。
⑥バックアップの保存期間とタイミングを設定します。
開始時刻は「UTC」で設定する必要があることに注意してください。
⑦RDSの状態をモニタリングするかを選択します。
状態把握をする必要がある場合は、こちらで「はい」を選択します。
⑧マイナーバージョンの自動アップグレードを有効にするかを決めます。
アップグレードをする際には、サーバーが再起動されます。
今回は検証環境のため「はい」にしていますが、
サービス停止が許容できる環境でない限りは「いいえ」を選択するべきです。
こちらも開始時刻は「UTC」で設定する必要があることに注意してください。
⑨全ての項目の設定が完了し「DBインスタンスの作成」ボタンをクリックするとインスタンスの作成が始まります。

EC2と同様、インスタンスの作成が完了するまで少しの時間がかかります。

インスタンス作成が完了した画面です。
①ステータスが「利用可能」となっています。
②エンドポイントも決まりました。
この情報を元に、EC2より接続しますのでこちらの情報も控えておいてください。

DBサーバーへのコマンドでの接続

4章までの項目で、事前準備が整いました。
では、実際にMySQLに接続できるかの確認までおこなってみましょう。

ログイン

ここではターミナルソフトとして「TeraTerm」を利用しています。

①EC2のインスタンス作成時に確認したグローバルIPアドレスを記載してください。
※グローバルIPはElasticIP(固定IP)を設定していない場合、
インスタンスの停止、起動で変わるので注意してください。

②「OK」ボタンをクリック。
初回のみセキュリティ警告が出ると思いますが、IPに誤りがなければ問題ありませんのでそのまま「続行」ボタンをクリックして進んでください。

接続が完了すると、ログインプロンプト(ログイン情報の入力画面)が表示されます。
もし表示されない場合は、IPの誤りやセキュリティグループ等で弾かれている可能性がありますので再度確認してみてください。
①ユーザー名を入力します。RedHatの初期ユーザーは「ec2-user」です。
※この名称は選択したOSによって異なります。
分からない場合は「root」で接続を試みてください。
正しい鍵ファイルでrootに接続した場合にのみログインが可能なユーザーが表示されます。
それでも表示されない場合は鍵ファイルを誤っていますので、確認しなおしてください。

②EC2インスタンスを生成した際にダウンロードしたプライベートキーファイルを指定します。
※保存フォルダーに鍵ファイルが表示されない場合は「秘密鍵ファイル」のみ表示となっている可能性がありますので、その場合はプルダウンより「すべてのファイル(*.*)」を選択することにより表示されます。
③「OK」ボタンをクリック

図のようになれば、ログイン完了です。

コマンドでの接続

まずは接続に必要なコマンドをインストールします。

RedHat7の場合、mariaDB という MySQL 互換データベースがデフォルトでインストールされている可能性があります。
競合しないよう、アンインストールしておきます。

# 確認
yum list installed | grep maria

# アンインストール
yum remove mariadb-libs

続いて、mysqlクライアントのインストールを行います。

# yumリポジトリの追加
rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm

# インストール
yum install mysql

インストールができたら、mysqlコマンドにて接続してインスタンス作成時に作ったDBができているか確認してみましょう。
下記コマンドの「ホスト名」「ポート」はRDSインスタンスの箇所で確認したものに置き換えてください。
ユーザー名やコマンド実行後に聞かれるパスワードはインスタンス作成時に決めたものになります。
mysql -h [ホスト名] -P [ポート] -u master_hogehoge -p

下記はサンプルでの出力内容です。

[ec2-user@ip-172-31-25-157 ~]$ mysql -h test-hogehoge.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -P 3306 -u master_hogehoge -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 124
Server version: 5.7.19-log MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hogehoge_db        |
| innodb             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)


ここまでできましたら、AWS側でおこなうLAMP環境構築の事前準備は完了です。
次は、PHPからも接続してみます。

DBサーバーへのPHPでの接続

ここからはWebサーバー上に環境を用意していきます。

Aapcheインストール

まずはapacheをインストールします。apacheはyumリポジトリに、httpdという名前で登録されています。

yum install httpd

この一行のみでApacheのインストールは完了です。
※ここでは、設定をシンプルにするために一番簡単な方法をとっています。
この場合はバージョンが最新ではなかったりしますので注意してください。
最新が欲しい場合は、別なリポジトリやソースからのインストールを検討してみてください。

念のため、バージョンを確認しておきましょう。

[root@ip-172-31-25-157 ~]# httpd -v
Server version: Apache/2.4.6 (Red Hat Enterprise Linux)
Server built:   Oct  3 2017 09:37:04

バージョン2.4.6がインストールされたことが分かりました。

それでは、自動起動の設定と共にApacheを起動してみましょう。

# 自動起動設定
systemctl enable httpd.service

# Apache起動
systemctl start httpd.service

# ポート確認
netstat -lanput | grep http 
tcp6       0      0 :::80                   :::*                    LISTEN      8023/httpd     

ここで一度AWSの管理画面に戻ります。なぜか?
ここでピンときた方は、理解してついてきていますね!
前回作成した「セキュリティグループの設定」で、EC2へのHTTPアクセスは拒否してしまっているからです!

HTTPアクセス用セキュリティグループ設定

それでは、許可設定を追加していきましょう。

①「EC2ダッシュボード」の「セキュリティグループ」をクリック。
②自IPを許可した設定をクリック。
③「インバウンド」タブをクリック。
④「編集」ボタンをクリック。

①「ルールの追加」ボタンをクリック。

①プルダウンより「HTTP」を選択。
②プルダウンより「マイIP」を選択。
③「保存」ボタンをクリック。
※ここでは検証環境のため自IPのみを許可としていますが、一般公開する場合は別途セキュリティグループを作成しインバウンドのソースを全て許可にして、インスタンスに適用してください。

これで、自分のIPからのHTTP接続が許可されました。
では、さっそく接続してみましょう!

ブラウザーのアドレスバーに「http://サーバーのIPアドレス」と入力してアクセスしてみてください。
図のようなページが表示されれば成功です!

PHPインストール

続いてPHPのインストールを行います。

※後学のために記載しておきますが、この章でのインストールは最終的にアンインストールしますので実行する必要はありません。
お時間のない方は次章の「PHP7.2のインストール」までお進みください。

yum install php

はい。PHPもこの一行のみでインストールは完了です。
こちらも、何のバージョンがインストールされたか確認してみましょう。

[root@ip-172-31-25-157 ~]# php --version
PHP 5.4.16 (cli) (built: Oct  4 2017 03:09:42) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies

2018年2月1日時点では、Redhatのyumリポジトリからは「PHP5.4.16」がインストールされました。
これ、2015年には既にサポートが終了しているバージョンですね。
せめてセキュリティサポート期間内だったら良かったのですが。

手順を簡略化したい所ですが、サポートが終了しているものを利用するわけにはいきません。
このPHPはアンインストールします。
ここでは、依存性があるとして同時にインストールされたものも一緒に削除していきます。
※インストールした実行結果に記載がありますので、実行した方はご確認ください。
その際に、他で利用していないかの確認は忘れずに。

yum remove php libzip php-cli php-common

PHP7.2のインストール

まずは、yumコマンドが参照するリポジトリを追加します。

epelリポジトリ

yum install http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm

remiリポジトリ

yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

上記コマンドを実施することにより、下記へ参照先の設定が格納されます。

ls /etc/yum.repos.d/

[root@ip-172-31-25-157 src]# ls /etc/yum.repos.d/
epel.repo             mysql-community-source.repo     redhat-rhui.repo  remi-php71.repo  remi-safe.repo
epel-testing.repo     redhat.repo                     remi-php54.repo   remi-php72.repo  rhui-load-balancers.conf
mysql-community.repo  redhat-rhui-client-config.repo  remi-php70.repo   remi.repo

ようやく準備ができました。PHPのインストールにかかりましょう。
remi-phpXX.repoの数値がバージョンを表しています。
今回は執筆段階最新の7.2系をインストールします。mysqlとの接続も行いますので、一緒に「php-mysql」もインストールしています。

yum install --enablerepo=remi-php72 php php-mysql

先ほどと同じくバージョンを確認してみましょう。

[root@ip-172-31-25-157 src]# php --version
PHP 7.2.2 (cli) (built: Jan 30 2018 13:44:49) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

無事にバージョン「7.2.2」が入りました。
ではここで、実際にアクセスしてPHPが動作するか確認してみましょう。
動作確認用にPHPファイルを作成します。今回は、Apacheの設定を特に変更せずデフォルトで確認します。

[root@ip-172-31-25-157 src]# vi /var/www/html/info.php
<?php
phpinfo();

これだけです。
phpinfoという関数は、現在の設定情報等を確認するのに非常に便利な関数です。
確認のために、覚えておくとよいでしょう。
ですが、自分の情報を開示してしまうことになりますので、
テスト環境以外では必ず自分以外がアクセスできない場所に配置するよう心がけてください。

お次はMySQLとの接続です!

接続ができたら、画面に接続できたメッセージが表示されるプログラムになります。

[root@ip-172-31-25-157 src]# vi /var/www/html/connect_mysql.php
<?php

$mysqli  = new mysqli('test-hogehoge.ckfo5p8ojwnw.ap-northeast-1.rds.amazonaws.com', 'master_hogehoge', 'hogehogepw', 'hogehoge_db', '3306');
if ($mysqli->connect_error) {
  echo 'データベースに接続できませんでした。';
  echo '<hr>';
  echo $mysqli->connect_error;
}
else {
  echo 'データベースに接続できました!';
}

失敗した場合は、下部に表示されている内容から修正してください。

まとめ

いかがでしたでしょうか?
確認項目を含め、かなり詳細に記載したつもりでしたが、うまくいきましたでしょうか?
AWSは色々な検証に利用するのにも便利ですので、ぜひトライしてみてください!

AWSにおけるLAMP環境構築(事前準備編)

こんにちは!issaです。

クラウドサーバー、便利ですよね。昔はサーバーを構築する時には筐体選びに始まりデータセンター契約したり、ラック構成を考えたりと大変でしたが、今やボタン一つでできる時代。素晴らしいの一言ですね!今回は、そんな便利なクラウドの中でも無料期間が長く、これからサーバーを勉強しよう!とか、この構成で大丈夫か?みたいな検証を行う際に便利なAWS(Amazon Web Services)の紹介です。AWSを利用したLAMP環境の作成を例にして説明していきます。

今回は、なるべく無料の範囲内での検証環境作成を前提として構築します。初めてAWSにふれる方でも分かるように記載していきますので、これを機にTryしてみてはいかがでしょうか。逆にサーバー環境はいいから、とにかく開発環境が欲しい!といった方は「Cloud9」というAWSサービスもありますので、そちらを利用してみてください。いつか時間があれば、ご紹介させていただきます。

本記事は2回に分けて、下記流れにて説明を行います。

〇事前準備編

〇構築編

  • WEBサーバー (EC2インスタンス) 作成
  • DBサーバー (RDSインスタンス) 作成
  • WEBサーバーからDBサーバーへの接続

AWSは便利な反面、リスクも

AWSは非常に便利で何でもできる印象がありますが、それは裏をかえせば不正アクセス等で利用された場合に大変なリスクを抱えることになります。「aws 不正利用」で検索するととても怖い記事が・・・そうならないためにも、まずは事前準備をしっかりと!

アカウント作成までの流れは、オフィシャルが丁寧に記載してくれていますのでそちらをご参照ください。アカウント作成のリンクもそちらから遷移可能です。

まずは上記URLよりAWSアカウントを取得していただき、終わりましたら次章「アカウント保護」から始めていきましょう!

アカウント保護

適切に保護されていないアカウントを不正に利用されると、犯罪に利用されたり予想もしない請求がきてしまったりと不測の事態が発生する可能性があります。そんな事態にならないためにも事前の設定で備えておきます。

ここでは、下記の流れにて設定をおこなっていきます。

それでは早速アカウントを保護するため「IAM(Identity and Access Management)」の設定をしていきましょう!

ルートアカウントのMFA有効化

MFA(Multi-Factor Authentication)とは、日本語にすると多要素認証となります。
IDとパスワードのみよりも、強力にアカウントを守る事ができますので必ず設定するようにしてください。

①「すべてのサービス」をクリックし全てのサービスを表示してください。
②「セキュリティ、アイデンティティ、コンプライアンス」の中にある「IAM」をクリック。

①「ルートアカウントのMFAを有効化」をクリック。

①MFAの管理をクリック。

①有効にするMFAデバイスを選択します。

※個人的な検証環境等でしたら、スマートフォンがあれば可能な仮想MFAデバイス。
より強固にしたい、もしくは会社等共有の環境であればハードウェアMFAデバイスが良いでしょう。
こちらに、設定が可能なMFAデバイスの説明があります。
 

②有効にするデバイスを選択したら「次のステップ」ボタンをクリック。
今回は個人の検証環境を想定していますので、仮想MFAデバイスを選択しています。


①ここでは、仮想MFAデバイスに関しての注意文が表示されています。
オフィシャルの情報によると、互換性のあるアプリとしては「Google Authenticator」「Authy」というものが利用できます。

※Authyは、クラウドに情報を保存することにより複数の端末間で共有することが可能です。
携帯の紛失時等に復旧できるのも、非常に有難いですね。
そのため、個人で設定する際にはこちらの方が便利かと思います。
会社等での利用の場合、個人端末外で利用される恐れがありますので利用しない方が無難です。

②再度メッセージが不要な場合は「チェックボックス」にチェックを入れてください。
③「次のステップ」ボタンをクリック。

①仮想MFAデバイスで利用するアプリより、QRコードを読み込んでください。
②30秒で数値が更新されますので、連続2回、認証コード1,2と続けて入力してください。
③入力ができましたら「仮想MFAの有効化」ボタンをクリック。

①「完了」ボタンをクリックで、ルートアカウントのMFA有効化が完了です。

①ステータス画面でも、ルートアカウントのMFAを有効化の欄が警告マークではなくなったのが確認できます。

MFAに関しては、金融系サイト等でも利用されていますのでご存知の方も多かったのではないでしょうか?AWSだとここで設定可能だったんですね!

次は、更にセキュリティレベルを上げるため、IP制限をかけるポリシーを作成します。
固定IP環境ではない方は、こちらの手順は飛ばしてください。

IP制限ポリシーの作成

①「ポリシー」をクリック。
②「ポリシーの作成」ボタンをクリック。

①設定内容を、直接記述するために「JSON」タブをクリック。

①今回のコードは「アクセス元が特定のIP以外だった場合、全てのアクションを拒否する」というものになります。
コンソールへのログインを直接防ぐことは、現状のAWSの仕様上できませんが、仮に不正アクセスされたとしても特定のIP以外はほとんどの操作が不可能となります。

IPアドレスはCIDR表記にて記載してください。
※CIDRとは下記SourceIpに記載しているようなIPアドレスの範囲をまとめて記載する記法です。

詳細はこちら


{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Deny",
        "Action": "*",
        "Resource": "*",
        "Condition": {
            "NotIpAddress": {
                "aws:SourceIp": [
                    "xxx.xxx.xxx.xxx/32",
                    "yyy.yyy.yyy.yyy/28"
                ]
            }
        }
    }
}

②コードの記載が終わったら「Review policy」ボタンをクリック。

①適当な名前を設定してください。今回は「SourceIPRestriction」としました。
②「明示的な拒否」が全サービスに対しておこなわれているのが確認できます。
③「Create policy」ボタンをクリック。

図のように完了メッセージがでれば、IP制限のポリシー作成が完了です。

環境によっては、この設定は不要な場合もあるかと思います。しかし、次の設定は各個人の権限に関わる所となりますので読み飛ばしは厳禁ですよ!

IAMグループの作成

個々のユーザー毎にポリシーを設定していくと、大変手間がかかります。
そのため、ある程度のポリシーをまとめるためのグループを作っておきます。
各ユーザーをこのグループに所属させることにより、一括して管理が可能です。

用途によって、グループは様々作成する必要があると思いますが
今回は管理者グループと、一般開発者グループの2つを用意します。

①「グループ」をクリック。
②「新しいグループの作成」ボタンをクリック。

①管理者用グループ名を入力。ここでは「Administrators」とします。
②「次のステップ」ボタンをクリック。

①検索ボックスに「Admin」と記入。
②検索結果から「AdministratorAccess」のチェックボックスをクリック。
複数ポリシーを選択しますので、まだ「次のステップ」ボタンは押さないでください。

①検索ボックスに先ほど作成したポリシー名「SourceIPRestriction」を入力。
②先ほどと同様に「チェックボックス」をクリック。

①先ほどチェックしたポリシーが表示されていることを確認してください。
②問題なければ「グループの作成」ボタンをクリックして、管理者グループの作成は完了です。

続いて、一般開発グループを作成します。
今回はEC2とRDSの全ての機能を操作することが可能な権限を与えていますが、
実際の運用時には必要最小限の権限のみを与えることをおススメします。

①開発用グループ名を入力。ここでは「Developers」とします。
②「次のステップ」ボタンをクリック。

①検索ボックスに「ec2」と記入。
②検索結果から「AmazonEC2FullAccess」のチェックボックスをクリック。

①検索ボックスに「RDSFull」と記入。
②検索結果から「AmazonRDSFullAccess」のチェックボックスをクリック。

①検索ボックスに先ほど作成したポリシー名「SourceIPRestriction」を入力。
②先ほどと同様に「チェックボックス」をクリック。
③「次のステップ」ボタンをクリック。

①先ほどチェックしたポリシーが表示されていることを確認してください。
②問題なければ「グループの作成」ボタンをクリックして、一般開発グループの作成も完了です。

グループの作成ができましたので続いてユーザーを作成していきます。
まだまだ序章なのでついてきてくださいね!

IAMユーザーの作成

グループの作成ができましたので、続いてログイン用のIAMユーザーを作成します。
ユーザーもグループと同様、管理者および一般開発者をそれぞれ作成していきます。

①メニューから「ユーザー」をクリック。
②「ユーザーを追加」ボタンをクリック。

①管理者名を入力
②ログインが可能なユーザーとするため「AWS マネジメントコンソールへのアクセス」にチェック。
③「次のステップ:アクセス権限」ボタンをクリック。

①今回は管理者のユーザーですので、先ほど作成した「Administrator」グループへ所属させます。
②「次のステップ:確認」ボタンをクリック。

①Administratorグループに所属していることを確認し「ユーザーの作成」ボタンをクリック。

①三か所に同じ番号がありますが、このどこかでパスワードを確認しておいてください。
これ以降、同じパスワードを確認するすべがなくなりますので注意してください。
②パスワードの確認が完了したら「閉じる」ボタンをクリックし、ユーザーの作成は完了です。
同様の手順で、一般開発ユーザーも作成します。選択するグループを「Administrator」から「Developers」へ変えること以外同じですので、ここでの説明は割愛します。

先ほどまでの項目で、ユーザーの作成が完了しました。
ルートアカウントと同様に、IAMユーザーへもMFAを適用します。

①MFAが有効でないことが確認できます。
②「ユーザー名」をクリックします。

①「認証情報」タブをクリック。
②「ペンの画像」をクリック。
ここからは、ルートアカウントの時と同様の手順でMFAを対象のMFAデバイスに紐づけてください。

ここまでの作業で、アカウントの保護に関する設定ができました。
続いて請求関連の設定をおこなっていきます。

請求関連設定

AWSの特徴でもある従量課金。
少ない金額で運用が可能ですが、間違った運用をおこなってしまうと大変な請求が来ることもありえます。
計画的な利用のためのサービスが、既に用意されていますのでそちらを利用していきます。

ここでは、下記の流れにて設定をおこなっていきます。

予算設定

一か月の運用に対する予算を設定していきます。
ここでは、あまりコストをかけない想定で10ドルを予算額にしていきます。


※このサービスは、あくまで予算アラートです。設定金額を超えたからと言っていきなりサービスが停止するわけではないのでご注意ください。
また、予算を超えているかのチェックはリアルタイムにおこなわれるわけではなく、定期的なチェック時に超えていたらアラートメールが飛ぶという形になりますので
多額の料金がかかるサービスを利用する場合、それに応じた予算の設定が必要になります。

①画面右上のアカウント名をクリックし、メニューを表示させます。
②メニュー内より「請求ダッシュボード」をクリック。

①ダッシュボードが表示されたら、メニューより「予算」をクリック。
②AWS Budgets(予算)ページへ遷移したら「予算を作成」ボタンをクリック。

①予算に名前を付けます。
※複数アカウントを所持する予定がある方は、ここで付ける名前には全てのアカウントで一意になる名前を付けることをおススメします。
アラートメールには、この予算名のみが記載されるため
1つのアドレスで複数アカウントの通知を受け取っていた場合は
どのアカウントからのアラートなのか分からなくなってしまいます。

②予算額をドル単位で記載します。
③どのタイミングで通知を受け取るかを設定します。
 今回は予算の50%。5ドルを超えたら通知されるように設定しています。
④通知先のアドレスを設定します。
 即座に気づけるように、今回は携帯アドレスを設定しました。
⑤全ての入力が終わったら「作成」ボタンをクリック。

これで、予算の作成が完了です。

請求設定

定期的に請求ダッシュボードのチェックは必要ですが、
請求書に関してはメールでも受信できるようにしておきます。

①メニューより「設定」をクリック。
②「電子メールで PDF 版請求書を受け取る」をチェック。
③予算の設定はしていますが「無料利用枠の使用のアラートの受信」にもチェックを付けてより確実にしておきましょう。
④アラート受信のアドレスを設定。
⑤「設定の保存」ボタンをクリック。
画面上部に「設定を保存しました」とメッセージが表示されたら設定完了です。

IAMユーザーへの請求情報閲覧権限付与

このままですと、ルートアカウントでなければ請求関連の参照ができません。
そこで、先ほど作ったAdministratorグループに所属したユーザーには参照権限を与えるようにします。

①画面右上の「アカウント名」をクリック。
②メニューから「アカウント」をクリック。

①初期状態では、IAMユーザーが請求情報へアクセスできないようになっています。
②「編集」をクリック

①「IAM アクセスのアクティブ化」にチェック。
②「更新」ボタンをクリック。

①有効になっていたら、アクセスが可能になります。
※今回はAdministratorグループへ「AdministratorAccess」権限を付与しているため、その他操作は不要でした。
「AdministratorAccess」権限を持たないユーザーへ個別に設定する場合には、別途下記URLを参考に設定する必要があります。

事前準備完了

これで事前準備は完了です。
事前準備めんどくさーい!と思った方もいらっしゃるかもしれませんが、何事も自己防衛大事です。後悔してからでは遅いのです!

次回は「AWSにおけるLAMP環境構築入門(構築編)」です。

いよいよインスタンスの作成に入っていきます!
インスタンスとは「AWS クラウドにある仮想サーバー」を意味します。
ようやく本題って感じですね!
接続できるところまで記載していきますので、お楽しみに!!