チームハッカーズ編集チームでのインターンを終えて感じたこと

大学4年生の秋からチームハッカーズ編集チームのインターンシップで働き始めました。インターンというのは就職活動の中で「はい、私はどこどこのインターンシップでの体験を通じて……」的な武勇伝をしたいがためにするという人がほとんどなので、就職先が決まっている時期にインターンを始めるというのは結構珍しいはず。

私がこの時期にインターンを始めたきっかけは単純で、それまでやっていた家庭教師のアルバイトをクビになったからです。クビになってしばらくはインターネットを通じて翻訳のアルバイトをやりながら、基本的には無職を満喫していたのですが、安定した収入がないということは金銭的だけでなく精神的にもつらいものがあるということが分かりました。

そこで、4月から新社会人として働き始めるということもあり、より実践的な仕事ができるインターンという形での職探しを始め、そこで偶然拾っていただいたのがカタリストシステム様になります。それから約4ヵ月が経ってインターンを卒業しようとしている今、仕事内容を振り返り、そこから学んだことについてまとめてみたいと思います。

仕事を効率化する楽しさ

仕事を始めてまず初めに任されたのはオウンドメディアであるチームハッカーズに関する集計作業です。記事ごとのPV数や読了率、離脱率などの各種データをGoogle アナリティクスからエクスポートし、スプレッドシートにまとめるという作業です。働き始めた当初は公開されている記事数が少なかったので、それこそデータを手打ちで集計することができたのですが、だんだん記事の数が増えてくるとかなりの手間と時間がかかるようになります。そこで、効率化を図るために各種の関数やピボットテーブルなどの機能を使って作業を行うようになると、これがパズルのようでおもしろい。

この手の作業にほとんど触れてこなかったため、学ぶことが多く、新たな集計を頼まれるたびに「今回はどのようにすれば効率的に終わらせることができるのか」と考えて、楽しみながら作業をしていました。実感したのは、どんなに面倒くさく煩雑な作業でも、このように工夫して効率化することを考えながら行うと素早く終わらせることができるということです。何よりそっちのほうが楽しい。

目的意識の重要さ

集計作業のほかには記事の編集作業をやっていました。これも初めての経験だったわけですが、初めは他人の書いた文章に変更を加えるという作業にどうしても謙虚になってしまう部分があり、誤字脱字や文字の全角半角の修正などのマイナーなミスの校正に終始していました。全角カッコと半角カッコを見分けるのは得意になりましたが、物足りなさも感じていました。

しかし、ある時、自分の役割が何なのかということを考えた際に、私は原稿を書くライターさんの担当編集者なのではなく、チームハッカーズというメディアを成長させるための編集者なのだという思いに至りました。そして、ライターさんの書く原稿を、言い方は悪いかもしれませんが、作品というよりは素材として考えて校正を行うようになりました。このような考えの下、読者目線に立って原稿に目を通すと、原稿の内容を書き換えたり、段落を並び替えたり、大幅に削除する必要性が見えてきます。そして大胆な校正を行うことができるようになるのです。

例えば、以前、「こういうビジネスパーソンはダメだ!」といった内容の原稿があり、そこでダメポイントが10個ほど列挙してありました。内容的には同意できるものの、読んでいる側からすると次々にダメ出しされるのは気持ちがよくない。そこで、ダメポイントを3つに厳選し、ほかは削除しました。結果的にバランスの取れた読みやすい記事にすることができたと思います。

ここから学んだことは、自分は何のためにこの作業を行っているのかという目的意識が重要であるということ。そして、それは意識をしないとすぐに忘れてしまうということです。

マルチタスク作業で気づいたこと

インターンでは集計や校正のほかにも、記事のリサーチや新しい記事の執筆など、様々な作業が任されます。私の場合、一つのタスクを終えてから次のタスクに移るというよりは、マルチタスクで作業を行っていました。

複数の作業を同時にこなしていくマルチタスクは、チームハッカーズの中でも何度も取り上げられているテーマです。実際にマルチタスクを行うと、簡単にマルチタスクといっても、どれが一つのタスクなのかということが結構曖昧なのだと実感しました。作業内容で決めるのか、作業をする場所で決めるのか、作業を命じた人で決めるのか、切り口はたくさんあります。

結局はそれぞれのケースで臨機応変な軸選びをして対応するに尽きると思うのですが、見落としがちな軸として、どういう脳の使い方をするのかという軸があるな、と感じました。データを集計するという作業と、記事を校正するという作業と、記事を執筆するという作業は、何よりも脳の使い方が違います。つまり、疲れ方が違うのです。そのため、校正作業をしていて疲労感を覚えていたとしても、いったん切り上げて集計作業を始めると疲れを感じないということがありました。もちろん、絶対的な作業量にもよるのだと思いますが、脳の使い方というのは一つ重要な軸であると感じます。

少し心残りも…

心残りだった点としては、いわゆるPDCAサイクルを回すという経験ができなかったことが挙げられます。私がチームハッカーズの編集に携わった時期はメディアの立ち上げ期で、全体的にPV数が少なかったため、記事の書き直しや記事タイトルのABテストを行っても大きな変化を確認することができませんでした。自分の感覚では編集を通じて記事が良いものになっているという思いがあるのですが、それを数字で確かめることができなかったのは残念でした。

一方で、立ち上げ段階で記事数が少ない時期から集計作業に携わったことにより、自分のペースで試行錯誤しながら関数などの使い方を学ぶことができたというメリットがありました。今後、インターンとしてチームハッカーズの編集に携わる学生にはどうしても体験できない点だと思います。逆に、その人は増加したPV数を利用してPDCAサイクルを回していく経験ができると思うので、お互いさまというところでしょうか。

印象に残った飲み会

仕事以外では、やはり、飲み会が印象的でした。私が初めて出勤したのは月曜日だったのですが、仕事の後で歓迎飲み会を開いていただきました。私も結構飲むほうなので、「月曜日」から気軽に飲み会が開かれる環境に胸躍ったことは忘れられないです。
また、昨年末に参加した忘年会では、Nintendo Switchをかけたビンゴ大会でなぜか絶対に自分が取れるという気がしていたのですが、残念ながら気のせいで終わってしまったにも関わらず、実は詳細をあまり覚えていないという体たらくで、、、でも会社の名誉のために言っておきますが飲み会だけがよかった、ということではありませんので念を押しておきます。でも、こういうコミュニケーションの機会が多い会社であるということは強調しておきたいですね。

まとめ

4ヵ月と短い間でしたが、今後役に立つスキルをたくさん習得することができたと思います。また何より、私服で勤務できたり、コーヒーを無料で飲めたり、作業中に音楽を聞けたりと、とても居心地の良い環境で働くことができたのが良かったです。

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は色々な検証に利用するのにも便利ですので、ぜひトライしてみてください!