決められたルールの中で制限時間内に限界までサイトの速度を早くしてスコアを競う ISUCON、今年も New Relic は昨年に引き続きスポンサーをさせて頂いております。

New Relic のスポンサープログラムについては以下のブログでご紹介しておりますのでご確認ください。

https://newrelic.com/jp/blog/nerd-life/isucon13

本記事では構築された ISUCON12 の環境に対して Ansible を利用して New Relic の Infrastructure Agent を導入していく手順を紹介します。
昨年の記事で Infrastructure Agent を導入する方法は紹介されていますので過去記事も併せてご確認ください。

https://newrelic.com/jp/blog/how-to-relic/isucon-infra

ISUCON 環境の構築

まず ISUCON の環境を作成します。
昨年の大会で使われたリポジトリがありそこから Cloudformation が用意されているのでそちらを利用して環境構築するのが一番早いです。
実際に利用する場合に AWS のコストがかかってしまいますのでコストには注意してご利用ください。

2023/10/20 現在リポジトリに記載のある AMI が利用できないようなのでまず AMI を自前でビルドします。

provisoning というディレクトリに packer が用意されているので make コマンドで実行します。

cd provisoning 

make build

成功すると AMI が AWS アカウントに追加されますのでその AMI を控えてもらって Cloudformation を実行します。

一部だけ切り取りますので適時置き換えてください。

  QualifyInstance1:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-05c5b59deed48f66b → 作成した AMI の ID に変更
      InstanceType: c5.large
      SecurityGroupIds:
        - !Ref SecurityGroup

変更したら実際に cloudformation を実行します。
CLI でも GUI からでも好みの方法でやって頂くことが可能ですが筆者は CLI で実行しましたので例を紹介します。

aws cloudformation deploy --template-file cloudformation.yaml --stack-name isucon-12 --capabilities CAPABILITY_NAMED_IAM

無事 CloudFormation が成功すれば ISUCON の環境が構築されますのでいよいよ New Relic の Agent を導入していきます。

Ansible を使って New Relic Infrastructure Agent を導入する

ここからは実際に New Relic の Infrastructure Agent を Ansible を使って導入していきますがいくつかの手順にわけて進めていきます。

1. SSH の設定をする

実際に作業をする上で EC2 instance に SSH または Session Manager を利用する必要があるのですが筆者は SSH を利用します。
CloudFormation を使って作成した場合 Systems Manager の Parameter Store の /ec2/keypair/  配下に秘密鍵が置かれていますのでそちらの値を控えて自身の手元の環境に設定をします。

ubuntu ユーザーで SSH 可能ですになっています。
筆者は面倒なので ~/.ssh/config に設定をしました。

Host isucon-12
 HostName <ssh の対象にする EC2 のIP>
 User ubuntu
 IdentityFile ~/.ssh/<指定した key の名前>

SSHして問題なく入れましたら次は Ansible 自体の導入をします。

2. Ansible の導入

Ansible を実行するサーバーに対して Ansible のインストールを行います。
実行ユーザーを isucon に切り替えてインストールを実施します。

sudo su - isucon

apt install ansible

ansible --version
ansible 2.10.8
  config file = None
  configured module search path = ['/home/ubuntu/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3/dist-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0]

3. Ansible を使って New Relic Infrastructure Agent を導入する

最後に Ansible を使って Infrastructure Agent を導入します。
詳細の手順は New Relic のドキュメントを確認して頂く形にして手順のみ紹介しますが ansible-galaxy を利用してロールのインストールを実施します。

ansible-galaxy install newrelic.newrelic_install

#ansible.windowsとansible.utilsがまだインストールされていなければ、必要に応じて導入する

ansible-galaxy collection install ansible.windows ansible.utils

playbook を作成します。
実際に運用する際にはリポジトリなどに追加して頂くことが必要ですが今回は EC2 上のローカルに作成します。

ここで New Relic の API やアカウントIDを利用しますので New Relic のアカウントを作成されていない方はアカウントを作成して API キーを取得してください。

New Relic Sign up

API キーの取得 License Key を利用

yaml に環境変数が設定されていますがそれぞれ Github またはドキュメントで確認することができます

- name: Install New Relic infrastructure and logs
  hosts: all
  roles:
    - role: newrelic.newrelic_install
  vars:
    targets:
      - infrastructure
      - logs
      - mysql
      - nginx
      # - apm-php
      # - apm-dotnet
      # See all available targets at: https://github.com/newrelic/ansible-install
  environment:
    NEW_RELIC_API_KEY: <New Relic のライセンスキー>
    NEW_RELIC_ACCOUNT_ID: "New Relic のアカウントID"
    NEW_RELIC_REGION: US
    NEW_RELIC_MYSQL_ROOT_PASSWORD: root
    NEW_RELIC_MYSQL_PASSWORD: isucon
    NEW_RELIC_MYSQL_USERNAME: isucon

inventory の設定をします。
こちらも同様にローカルにファイルを作成します。

各 EC2 の Private IP や ansible 実行時にそれぞれのインスタンスに ssh を実行するので ansible の実行インスタンスでも ssh key の設定をする必要があります。
それらの設定をした設定例のファイルが以下になります。

all:
  hosts:
    host1:
     ansible_host: <作成された EC2 の Private IP>
    host2:
      ansible_host: <作成された EC2 の Private IP>
    host3:
     ansible_host: <作成された EC2 の Private IP>
  vars:
    ansible_port: 22
    ansible_ssh_private_key_file: ~/.ssh/<作成したキーの名前>
    ansible_user: ubuntu

ansible を実際に実行します。

ansible-playbook playbook.yaml -i inventory.yaml

エラーがなく終了したら New Relic にデータが反映されているか確認しましょう。
Agent がセットアップされてから最初にデータが転送されるまで数分ほどかかります。