決められたルールの中で制限時間内に限界までサイトの速度を早くしてスコアを競う ISUCON、今年も New Relic は昨年に引き続きスポンサーをさせて頂いております。
New Relic のスポンサープログラムについては以下のブログでご紹介しておりますのでご確認ください。
https://newrelic.com/jp/blog/nerd-life/isucon13
本記事では構築された ISUCON12 の環境に対して Ansible を利用して New Relic の Infrastructure Agent を導入していく手順を紹介します。
昨年の記事で Infrastructure Agent を導入する方法は紹介されていますので過去記事も併せてご確認ください。
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 キーを取得してください。
- 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 がセットアップされてから最初にデータが転送されるまで数分ほどかかります。
次のステップ
これで Ansible で New Relic Infrastrucure Agent を導入する手順は以上となります。
実際にベンチマーカーなどを実施して負荷がどれくらいなのかを分析して New Relic がプレイヤーの皆様のスコアアップの手助けとなれば幸いです。
他記事で Go に APM を導入するなどもありますのでそちらもあわせてご利用ください。
本ブログに掲載されている見解は著者に所属するものであり、必ずしも New Relic 株式会社の公式見解であるわけではありません。また、本ブログには、外部サイトにアクセスするリンクが含まれる場合があります。それらリンク先の内容について、New Relic がいかなる保証も提供することはありません。