Amazon Web Services ブログ

Perforce Helix Core を AWS 上に構築する (Part3)

イントロダクション

3回にわたるAWSでのPerforce構築シリーズもこれで最後になりました。

Part1ではAWS 上で Perforce Helix Core を構築することの利点と技術的ポイントを俯瞰しました。
前回のPart2では AWS CloudFormation を用いてPerforceサーバーを構築する方法を解説しました。

今回のPart3では、Part2の手順7、CloudFormationの設定において「Enable Replica」をYesにしてReplica Serverの構築を有効にした場合のReplica ServerのSetup手順を紹介します。
Part2の手順で、Master Serverのみの構築を希望した場合は、こちらの手順は必要ありません。

もちろん、もう一度前回の記事の手順を最初からやり直して、Replica構築を有効にして、本記事の手順を実行していただくこともできます。

さて、実際の Replica server の構築手順ですが、これはAWS特有というわけではなく、Perforceの通常の構築手順に従って手動でコマンドを実行して行くというものになります。

それでは実際に手順を見ていきましょう!

事前準備

  • こちらのPart2の手順を実行していることが前提になります。実行されていない方はまずは前回の記事の手順を実行し、その際に必ず「手順7」の「Enable Replica」をYesにして有効にします。
  • こちらを参考にして東京リージョンで任意の名前のS3バケットを用意しておいてください。S3バケットの名前は全世界で一意の名前にする必要があります。
    • 例えば次のようなS3バケットの名称にすると他のバケット名との衝突を避けることができます。
      • (例) perforce-test-[自分の名前]-[日付] など

Replica Serverをセットアップする

Replicaの動作を定義するには、Perforceのコマンドである“p4 configure set”コマンドを使用して、Master serverのdb.configファイルに構成情報を入力する必要があります。Replicaを作るにはまず最初にMaster serverを設定します。Master serverの設定が、後でReplica serverに複製されます。

Mater Server側で設定を行う

  1. まずは、Master Serverにsshログインします。下記では適宜、自分のssh keyとEIPアドレスに置き換えてください。
    $ ssh -i ~/.ssh/general-key.pem p4admin@18.180.250.162
  2. 前回Part2でp4adminユーザーをサーバー側に作成していない場合は作成します。作成済みの場合はスキップして次に進みます。下記のコマンドを実行するとviが起動しますので内容を確認して、「:wq」をタイプして保存します。
    [p4admin@master ~]$ p4 user p4admin
    User p4admin saved.
  3. 下記のコマンドを実行してReplicaサーバの設定を記述します。Replica Serverには「p4d-ha-awsnva」という固有のServer IDを付けます。なお、Master ServerのServer IDは、「master.1」です(すでに設定済み)。
    [p4admin@master ~]$ p4 server p4d-ha-awsnva
    Server p4d-ha-awsnva saved.
    • 実行するとviが開きますので、「Services:」と「Description:」を下記のように設定して、保存します。
      # viが開いたら、「i」をタイプして変更内容を記載。記載したら[esc]を押してから「:wq」で変更を保存してviを閉じる。
      # Services:とDescription:を下記のように変更する
      ServerID:    p4d-ha-awsnva
      Type:    server
      Services:    replica
      Options:    nomandatory
      Description:   Read-only replica pointing to master.1:1666
  4. 下記のコマンドを実行して、出力されるジャーナルファイルのprefixがp4_1になるように設定します。
    [p4admin@master ~]$ p4 configure set master#journalPrefix=/p4/1/checkpoints/p4_1
    For server 'master', configuration variable 'journalPrefix' set to '/p4/1/checkpoints/p4_1'
  5. 下記のコマンドを実行してReplica serverとしてp4d-ha-awsnvaという名前のサーバを設定し、同期先のMaster serverとして10.0.0.63:1666を設定します。この設定によりReplicaはMasterからメタデータとバージョンファイルを取得して同期します。
    [p4admin@master ~]$ p4 configure set p4d-ha-awsnva#P4TARGET=10.0.0.63:1666
    For server 'p4d-ha-awsnva', configuration variable 'P4TARGET' set to '10.0.0.63:1666'
  6. Replicaの複製プロセスを作成します。以下に示す5つのstartup.nコマンドを構成します(スペースで区切られた複数の値を受け渡す場合は、その値のセット全体をダブルクォーテーションで囲む必要があります)。以下の起動プロセスはジャーナルデータやアーカイブデータを1秒間隔でポーリングするようにp4 pullが設定されます。
    [p4admin@master ~]$ p4 configure set "p4d-ha-awsnva#startup.1=pull -i 1"
    For server 'p4d-ha-awsnva', configuration variable 'startup.1' set to 'pull -i 1'
  7. startup.2からstartup.5までは、同一のコマンドを実行するのでループで実行させます。
    [p4admin@master ~]$ for i in `seq 2 5`; do p4 configure set "p4d-ha-awsnva#startup.${i}=pull -u -i 1"; done
    For server 'p4d-ha-awsnva', configuration variable 'startup.2' set to 'pull -u -i 1'
    For server 'p4d-ha-awsnva', configuration variable 'startup.3' set to 'pull -u -i 1'
    For server 'p4d-ha-awsnva', configuration variable 'startup.4' set to 'pull -u -i 1'
    For server 'p4d-ha-awsnva', configuration variable 'startup.5' set to 'pull -u -i 1'
  8. 下記のコマンドを実行して構成可能変数のdb.replication(メタデータへのアクセス)とlbr.replication(ディポファイルへのアクセス)を読み取り専用に設定します。
    [p4admin@master ~]$ p4 configure set "p4d-ha-awsnva#db.replication=readonly"
     For server 'p4d-ha-awsnva', configuration variable 'db.replication' set to 'readonly'
    [p4admin@master ~]$ p4 configure set "p4d-ha-awsnva#lbr.replication=readonly"
     For server 'p4d-ha-awsnva', configuration variable 'lbr.replication' set to 'readonly'
  9. ReplicaがMasterへ接続しに行く際のサーバ間通信の認証を設定します。認証にはサービスユーザーという特殊なユーザーが使われますので、接続を許可するサービスユーザー名「svc_replica」を設定します。
    [p4admin@master ~]$ p4 configure set p4d-ha-awsnva#serviceUser=svc_replica
    For server 'p4d-ha-awsnva', configuration variable 'serviceUser' set to 'svc_replica'
  10. ここでは下記のコマンドを実行して、実際のサービスユーザー「svc_replica」を作成します。
    [p4admin@master ~]$ p4 user -f svc_replica
    User svc_replica saved.
    • viが開いて下記のように表示されているのを確認して、「:wq」をタイプして保存します。
      User:   svc_replica
      
      Email:  svc_replica@master
      
      FullName:       svc_replica
  11. サービスユーザーのパスワードを設定します。パスワードは自分が覚えやすい任意のものでいいですが、こちらは後ほどの手順で使いますので、しっかりと覚えておいてください。
    [p4admin@master ~]$ p4 passwd svc_replica
    Enter new password:
    Re-enter new password:
    Password updated.
  12. ServiceUsersというユーザーグループを設定します。
    [p4admin@master ~]$ p4 group ServiceUsers
    Group ServiceUsers created.
    • viが起動しますので、下記のように「Timeout:」と「Users:」の設定値を変更します。「:wq」をタイプして保存します。
      # 下記のようにTimeout:とUsers:の設定値を変更します。
      
      Group:  ServiceUsers
      
      MaxResults:     unset
      
      MaxScanRows:    unset
      
      MaxLockTime:    unset
      
      MaxOpenFiles:   unset
      
      Timeout:        unlimited
      
      PasswordTimeout:        unset
      
      Subgroups:
      
      Owners:
      
      Users:  svc_replica
  13. p4 protectコマンドを実行することでサービスユーザにsuper権限を付与します。
    [p4admin@master ~]$ p4 protect
    Protections saved.
    • viが起動しますので、下記のようにProtections:の最後の行に「super group ServiceUsers * //…」という設定を一行追加します。追加したら「:wq」をタイプして保存します。
      # 「super group ServiceUsers * //...」 を最後の行に追加する
      Protections:
              write user * * //...
              super user p4admin * //...
              super group ServiceUsers * //...
  14. 下記のコマンドを実行してMaster serverでチェックポイントを作成します。そのチェックポイントをReplicaに復元することにより、Replica serverを構築します。
    [p4admin@master ~]$ p4 admin checkpoint -Z
  15. 下記を実行してチェックポイントとジャーナルファイルを書き出します。
    [p4admin@master ~]$ p4 journals -F type=checkpoint -m1 -T jfile
    ... jfile /p4/1/checkpoints/p4_1.ckp.1.gz
  16. 下記のように現在までのチェックポイントが「p4_1.ckp.1.gz」という名前で書き出されているのがわかります。これをReplica Server側にコピーして適用し、Replicaをスタートさせればレプリケーションが開始されます。
    [p4admin@master ~]$ ls -al /p4/1/checkpoints/
    合計 36
    drwx------ 2 p4admin perforce    67  4月 24 04:25 .
    drwx------ 4 p4admin perforce    39  4月 23 11:09 ..
    -r--r----- 1 p4admin perforce  3703  4月 24 04:25 p4_1.ckp.1.gz
    -r--r----- 1 p4admin perforce    70  4月 24 04:25 p4_1.ckp.1.md5
    -r--r----- 1 p4admin perforce 27398  4月 24 04:25 p4_1.jnl.0
  17. 今回作成したS3バケットへ一旦checkpoint fileをコピーして保存しておきます。下記のコマンド内の<YOUR BUCKET>の部分を「事前準備」の項目で作成した自分のバケット名(perforce-test-[自分の名前]-[日付]など)に置き換えてください。
    [p4admin@master ~]$ aws s3 cp /p4/1/checkpoints/p4_1.ckp.1.gz s3://<YOUR BUCKET>/aws-perforce/checkpoints/
    upload: ../../p4/1/checkpoints/p4_1.ckp.1.gz to s3://<YOUR BUCKET>/aws-perforce/checkpoints/p4_1.ckp.1.gz
  18. 同様にMasterにあるdepotのデータもS3バケットにコピーして一旦保存しておきます。
    [p4admin@master ~]$ aws s3 cp  /p4/1/depots/  s3://<YOUR BUCKET>/aws-perforce/depots/ --recursive
    upload: ../../p4/1/depots/spec/protect.p4s,d/1.1.gz to s3://<YOUR BUCKET>/aws-perforce/depots/spec/protect.p4s,d/1.1.gz
    upload: ../../p4/1/depots/spec/user/71,d/p4admin.p4s,d/1.1.gz to s3://<YOUR BUCKET>/aws-perforce/depots/spec/user/71,d/p4admin.p4s,d/1.1.gz
    upload: ../../p4/1/depots/spec/group/12,d/serviceusers.p4s,d/1.1.gz to s3://<YOUR BUCKET>/aws-perforce/depots/spec/group/12,d/serviceusers.p4s,d/1.1.gz
    upload: ../../p4/1/depots/spec/server/74,d/p4d-ha-awsnva.p4s,d/1.1.gz to s3://<YOUR BUCKET>/aws-perforce/depots/spec/server/74,d/p4d-ha-awsnva.p4s,d/1.1.gz
    upload: ../../p4/1/depots/spec/user/96,d/svc_replica.p4s,d/1.1.gz to s3://<YOUR BUCKET>/aws-perforce/depots/spec/user/96,d/svc_replica.p4s,d/1.1.gz
    upload: ../../p4/1/depots/spec/server/48,d/replica1.p4s,d/1.1.gz to s3://<YOUR BUCKET>/aws-perforce/depots/spec/server/48,d/replica1.p4s,d/1.1.gz
    upload: ../../p4/1/depots/spec/depot/7,d/unload.p4s,d/1.1.gz to s3://<YOUR BUCKET>/aws-perforce/depots/spec/depot/7,d/unload.p4s,d/1.1.gz
  19. ここまででMaster Server側で行う作業は終了です。次にReplica Server側で設定を行います。

Replica Server側で設定を行う

  1. Replica Serverで設定を行いますので、Replica Serverにsshログインします。下記では適宜、自分のssh keyとEIPアドレスに置き換えてください。Replica ServerのIPアドレスは、CloudFormationスタックの「出力」タブの「PerforceReplicaEIP」で確認できます。
    $ ssh -i ~/.ssh/general-key.pem p4admin@18.180.134.170
  2. Master Serverと同じようにサーバーの接続先を環境変数として設定しておきます。
    [p4admin@p4d-ha-awsnva ~]$ echo 'export P4PORT=localhost:1666' >> ~/.bash_profile
    [p4admin@p4d-ha-awsnva ~]$ source ~/.bash_profile
  3. 今度は先ほどS3に保存したcheckpoint fileとdepotをReplica Server側にコピーします。下記のコマンド内の<YOUR BUCKET>の部分を「事前準備」の項目で作成した自分のバケット名(perforce-test-[自分の名前]-[日付]など)に置き換えてください。
    [p4admin@p4d-ha-awsnva ~]$ aws s3 cp s3://<YOUR BUCKET>/aws-perforce/checkpoints/p4_1.ckp.1.gz /p4/1/checkpoints/
    download: s3://<YOUR BUCKET>/aws-perforce/checkpoints/p4_1.ckp.1.gz to ../../p4/1/checkpoints/p4_1.ckp.1.gz
    [p4admin@p4d-ha-awsnva ~]$ aws s3 cp s3://<YOUR BUCKET>/aws-perforce/depots/ /p4/1/depots/ --recursive
    download: s3://<YOUR BUCKET>/aws-perforce/depots/spec/protect.p4s,d/1.1.gz to ../../p4/1/depots/spec/protect.p4s,d/1.1.gz
    download: s3://<YOUR BUCKET>/aws-perforce/depots/spec/depot/7,d/unload.p4s,d/1.1.gz to ../../p4/1/depots/spec/depot/7,d/unload.p4s,d/1.1.gz
    download: s3://<YOUR BUCKET>/aws-perforce/depots/spec/group/12,d/serviceusers.p4s,d/1.1.gz to ../../p4/1/depots/spec/group/12,d/serviceusers.p4s,d/1.1.gz
    download: s3://<YOUR BUCKET>/aws-perforce/depots/spec/server/74,d/p4d-ha-awsnva.p4s,d/1.1.gz to ../../p4/1/depots/spec/server/74,d/p4d-ha-awsnva.p4s,d/1.1.gz
    download: s3://<YOUR BUCKET>/aws-perforce/depots/spec/user/71,d/p4admin.p4s,d/1.1.gz to ../../p4/1/depots/spec/user/71,d/p4admin.p4s,d/1.1.gz
    download: s3://<YOUR BUCKET>/aws-perforce/depots/spec/server/48,d/replica1.p4s,d/1.1.gz to ../../p4/1/depots/spec/server/48,d/replica1.p4s,d/1.1.gz
    download: s3://<YOUR BUCKET>/aws-perforce/depots/spec/user/96,d/svc_replica.p4s,d/1.1.gz to ../../p4/1/depots/spec/user/96,d/svc_replica.p4s,d/1.1.gz
  4. コピーしてきたデータからMasterの現在の設定をReplicaに反映しますので、一旦Replicaのp4d processを終了します。
    [p4admin@p4d-ha-awsnva ~]$ /p4/1/bin/p4d_1_init stop
  5. 現在Replica側に残っているdatabaseファイルを全て消去します。
    [p4admin@p4d-ha-awsnva ~]$ sudo rm -fr /p4/1/root/db.*
  6. Replica側にcheckpoint fileを適用してdatabaseを復元します。
    [p4admin@p4d-ha-awsnva ~]$ /p4/1/bin/p4d_1 -r /p4/1/root -jr -z /p4/1/checkpoints/p4_1.ckp.1.gz
    Perforce db files in '/p4/1/root' will be created if missing...
    Recovering from /p4/1/checkpoints/p4_1.ckp.1.gz...
  7. 下記のスクリプトを実行します。
    [p4admin@p4d-ha-awsnva ~]$ source /p4/common/bin/p4_vars 1
  8. 先ほど設定したReplicaのサービスユーザーとしてMasterに接続しに行きます。この際に使用するpasswordは先ほど「Mater Server側で設定を行う」の手順11で自分の設定した任意のパスワードとなります。
    [p4admin@p4d-ha-awsnva ~]$ /p4/1/bin/p4_1 -p 10.0.0.63:1666 -u svc_replica login
    Enter password:
    User svc_replica logged in.
  9. 設定が反映されたのでReplicaとしてサーバーを起動させます。
    [p4admin@p4d-ha-awsnva ~]$ /p4/1/bin/p4d_1_init start
    Preflight check: /p4/1/bin/p4d_1 -r /p4/1/root -xvU
    Preflight journal corruption check
    Starting /p4/1/bin/p4d_1 -p 1666 -r /p4/1/root -J /p4/1/logs/journal -L /p4/1/logs/log -q --daemonsafe --pid-file
  10. サーバが起動したら「p4 info」コマンドを実行すると、「Server services: replica」「Replica of: 10.0.0.63:1666」と表示されており、Replicaとして起動していることが確認できます。
    [p4admin@p4d-ha-awsnva ~]$ p4 info
    User name: perforce
    Client name: p4d-ha-awsnva
    Client host: p4d-ha-awsnva
    Client unknown.
    Current directory: /home/p4admin
    Peer address: 127.0.0.1:43042
    Client address: 127.0.0.1
    Server address: localhost:1666
    Server root: /p4/1/root
    Server date: 2020/04/24 05:34:26 +0000 UTC
    Server uptime: 00:02:33
    Server version: P4D/LINUX26X86_64/2019.2/1942501 (2020/04/02)
    ServerID: p4d-ha-awsnva
    Server services: replica
    Replica of: 10.0.0.63:1666
    Server license: none
    Case Handling: insensitive
  11. Masterのデータと定期的に同期するためのp4 pullコマンドのプロセスが動いているかどうかを確認するためには下記のコマンドを実行します。Master側のp4 configureで設定した、5つの同期プロセスが稼働していれば正常にMasterとReplicaが同期されています。(もし「You don’t have permission for this operation.」というエラーが出る場合は、一度ログアウトして、もう一度sshでログインしてから実行してみてください。)
    [p4admin@p4d-ha-awsnva ~]$ p4 monitor show -a
     5631 B svc_replic 00:05:11 pull sleeping 1000 ms
     5632 B svc_replic 00:05:11 pull sleeping 1000 ms
     5633 B svc_replic 00:05:11 pull sleeping 1000 ms
     5634 B svc_replic 00:05:11 pull sleeping 1000 ms
     5635 B svc_replic 00:05:11 pull sleeping 1000 ms
     5685 R p4admin    00:00:00 monitor show -a
  12. 下記のコマンドを実行してReplicationのステータスを確認します。[Current replica journal state]が[Current master journal state]と同一のポジションを指していれば、最新の状態に同期されています。SequenceがMasterとずれていて、Replicaの方が遅れている場合には、少し待ってからもう一度コマンドを実行して確認します。
    [p4admin@p4d-ha-awsnva ~]$ p4 pull -lj
    Current replica journal state is:    Journal 1,    Sequence 2315.
    Current master journal state is:    Journal 1,    Sequence 2315.
    The statefile was last modified at:    2020/04/24 08:10:08.
    The replica server time is currently:    2020/04/24 08:11:05 +0000 UTC
  13. Master serverのバージョンファイルをReplica serverにコピーすると、オペレーティングシステムによってそれらのファイルが転送されます。この転送プロセス中にデータの破損が発生していないかどうかを確認するには、Replica server上で以下のようにp4 verifyコマンドを実行します。
    [p4admin@p4d-ha-awsnva ~]$ p4 verify //...
    //spec/depot/unload.p4s#1 - add default change (text+C) F91D33DCE8E82DBA82859BB767392A07
    //spec/group/ServiceUsers.p4s#1 - add default change (text+C) F550D3915DC8B032BA6ED084DA9AA068
    //spec/protect.p4s#1 - add default change (text+C) A0240A13D4785D3F53C0FDE3E029A605
    //spec/server/p4d-ha-awsnva.p4s#1 - add default change (text+C) 94350051CA792A37847BC516DE94258D
    //spec/server/replica1.p4s#1 - add default change (text+C) A60AA4A0394FD9213B389E0285B30CDD
    //spec/user/p4admin.p4s#1 - add default change (text+C) EE316B2F92F6E8AD5A49CB653C73D2F9
    //spec/user/svc_replica.p4s#1 - add default change (text+C) A5E99395666E65C044F33D718FB3A5C8
  • これでReplica serverの構築手順は終了です。お疲れ様でした。

Replicaへのファイルの複製をテストする

ここでは、Master serverで新規に作成したファイルが、Replica側に複製されているかテストしてみます。

  1. Master serverにSSHでログインします。下記では適宜、自分のssh keyとEIPアドレスに置き換えてください。
    $ ssh -i ~/.ssh/general-key.pem p4admin@18.180.250.162
  2. 記事Part2のコミットテストで作成したrepositoryに移動して、新規にtest2.configというテスト用のファイルを作成します。
    [p4admin@master ~]$ cd repository/
    [p4admin@master repository]$ echo test2 > test2.config
  3. 下記のコマンドで、作成したファイルをチェンジリストに追加します。
    [p4admin@master repository]$ p4 -c p4admin add -t text test2.config
    //repository/test2.config#1 - opened for add 
  4. 下記のコマンドでディポに変更をsubmitします。
    [p4admin@master repository]$ p4 -c p4admin submit
    Change 1 created with 1 open file(s).
    Submitting change 1.
    Locking 1 files ...
    add //repository/test2.config#1
    Change 1 submitted.
    • コマンドを実行するとviが開くので「Description:」の部分に任意の変更理由を記述します。
      # viが開いたら、変更内容を記載。記載したら「:wq」で変更を保存してviを閉じる。
      # 変更内容を記載
      Description:
              add a new file test2
      Files:
              //repository/test2.config       # add
  5. 次に、Replica serverにSSHでログインします。下記では適宜、自分のssh keyとEIPアドレスに置き換えてください。
    $ ssh -i ~/.ssh/general-key.pem p4admin@18.180.134.170
  6. Replicaの同期状態を確認します。 先ほどよりもSequenceの番号が進んでいることが確認できます。
    [p4admin@p4d-ha-awsnva ~]$ p4 pull -lj
    Current replica journal state is:    Journal 1,    Sequence 6352.
    Current master journal state is:    Journal 1,    Sequence 6352.
    The statefile was last modified at:    2020/06/04 07:45:45.
    The replica server time is currently:    2020/06/04 07:54:39 +0000 UTC
  7. p4 printコマンドを実行して、Replica側に複製されたファイルとその内容を確認してみます。先ほど追加したファイルの内容「test2」がきちんと表示されています。
    [p4admin@p4d-ha-awsnva ~]$ p4 print //repository/test2.config
    //repository/test2.config#1 - add change 1 (text)
    test2
  8. ローカルに該当ファイルを保存したい場合は、下記のコマンドを実行します。
    [p4admin@p4d-ha-awsnva ~]$ p4 print -o test2.config //repository/test2.config
    //repository/test2.config#1 - add change 1 (text)

まとめ

3回のシリーズに渡ってPerforceをAWSに構築する方法を紹介してきました。みなさん、いかがだったでしょうか?

実際の本番環境にサーバを構築する際は、これ以外にPerforceのライセンスの設定が必要となります(5⼈のユーザと20個のワークスペースまでの環境ならライセンスがなくても利用できます)。

また、セキュリティを考慮するとSSLの設定が必要だったり、今回のようにインターネットアクセスを許容せず、VPC内のPrivate Subnetにサーバーを構築して実際のアクセスはVPNを介して通信を閉域にするといった工夫が必要でしょう。

今回はご紹介しきれなかった部分は、下記の参考資料をご参照いただければと思います。

AWS上にPerforceを構築する利点と手順を理解してただけたら、まずはお試しで動かしていただければ幸いです。

参考資料


著者について

保里 善太 (Zenta Hori)
AWS 技術統括本部 ソリューションアーキテクト

半導体関連精密機器の組み込み制御エンジニアとして研究開発のキャリアをスタートさせ、モバイルゲーム業界での開発経験、FinTech 業界でのエンジニア経験、スタートアップでの CTO 経験を生かして日々技術支援を必要としている AWS ユーザー様をサポートしています。現在はもっぱら機械学習を利用したセキュリティリスクの自動検知や機械学習をゲーム開発にどう活用するかに興味関心があり、日々研究や学習に励んでいます。