みなさんこんにちは。マネージドサービス部MS課の塩野(正)です。
この記事では、AWS CodePipelineとCodeBuildを使ってNew Relic監視設定を自動展開する方法を解説します。GitHubへのマージをトリガーに、CodePipelineが起動してterraform planとapplyを順次実行する仕組みを構築します。
実装後は、アラート設定やダッシュボードの変更をコードで管理でき、AWS環境と統合した形で安全に本番環境へ展開できるようになります。GitHub ActionsとAWS CodePipelineの比較については前回の記事をご確認ください。
目次
前提条件
- AWSアカウント
- GitHubアカウント
- New Relicアカウント
- Terraformの基本知識
事前準備
必要なもの
実装を始める前に、以下を準備します。
GitHubリポジトリ
Terraformコードを管理するリポジトリを作成します。既存のリポジトリを使う場合は、専用のディレクトリを作成すると管理しやすいでしょう。
New Relic APIキー
New Relicの管理画面から、User APIキーを取得します。APIキーは「User」タイプを選択し、適切な権限を付与してください。
AWSリソース
以下のAWSリソースを準備します。
- S3バケット(tfstate保存用)
- Secrets Manager(New Relic APIキー保存用)
- IAMロール(CodeBuild用)
ディレクトリ構成
推奨するディレクトリ構成は以下の通りです。
. ├── terraform/ │ ├── main.tf │ ├── variables.tf │ └── alert.tf └── buildspec.yml
Terraformコードはterraform/ディレクトリにまとめ、CodeBuildの設定はbuildspec.ymlに記述します。
Terraformコードの準備
Provider設定
New Relic Providerを設定します。APIキーは環境変数から取得する形にしておきます。
また、Provider設定でS3バケットをバックエンドとしての設定も実施します。環境ごとに異なる設定を使用できるよう、buildspec.ymlで環境変数を使って動的に設定します。
ここではbackendブロックのみを記述しますが、backend設定の詳細は terraform initコマンド実行時に-backend-configオプションで指定します。この方法により、環境ごとに異なるS3バケットやキーを使い分けられます。
terraform { required_version = ">= 1.8.0" required_providers { newrelic = { source = "newrelic/newrelic" version = "~> 3.0" } } backend "s3" {} } provider "newrelic" { account_id = var.newrelic_account_id api_key = var.newrelic_api_key region = "US" }
Variables設定
variables.tfファイルで必要な変数を定義します。
variable "newrelic_account_id" { description = "New Relic Account ID" type = string sensitive = true } variable "newrelic_api_key" { description = "New Relic User API Key" type = string sensitive = true }
これらの変数は、CodeBuildのbuildspec.ymlでTF_VAR_プレフィックス付きの環境変数として設定されます。
アラート設定の例
シンプルなアラート設定の例です。
resource "newrelic_alert_policy" "example" { name = "Example Alert Policy" } resource "newrelic_nrql_alert_condition" "high_cpu_usage" { policy_id = newrelic_alert_policy.example.id name = "High CPU Usage" enabled = true nrql { query = "SELECT average(host.cpuPercent) FROM Metric" } critical { operator = "above" threshold = 80 threshold_duration = 300 threshold_occurrences = "all" } }
この例では、CPU使用率が80%を超えた状態が5分間続いた場合にアラートが発生します。実際の運用では、サーバーの特性に合わせて閾値を調整してください。
AWSリソースの準備
S3バケット作成
tfstate保存用のS3バケットを作成します。
1. S3コンソールを開く
AWSコンソールから「S3」を検索して選択します。
2. バケットの作成
- 「バケットを作成」をクリック
- バケット名:
your-terraform-state-bucket(グローバルで一意の名前を指定) - AWSリージョン:
アジアパシフィック(東京)ap-northeast-1 - 「オブジェクト所有者」: デフォルトのまま(ACL無効)
- 「このバケットのブロックパブリックアクセス設定」: すべてチェック(パブリックアクセスをブロック)
3. バージョニングと暗号化の有効化
- 「バケットのバージョニング」セクションで「有効にする」を選択
- 「デフォルトの暗号化」セクションで「有効にする」を選択
- 暗号化タイプ: 「Amazon S3 マネージドキー (SSE-S3)」を選択
- その他の設定はデフォルトのまま
- 「バケットを作成」をクリック
バージョニングを有効化しておくと、万が一の際にtfstateファイルをロールバックできます。暗号化により、tfstateファイルに含まれる機密情報が保護されます。
Secrets Managerへのキー登録
New Relic APIキーとアカウントIDをSecrets Managerに登録します。
1. Secrets Managerコンソールを開く
AWSコンソールから「Secrets Manager」を検索して選択します。
2. シークレットの作成
- 「新しいシークレットを保存」をクリック
- シークレットのタイプ: 「その他のシークレットのタイプ」を選択
- キー/値のペア: 「プレーンテキスト」タブを選択
- 以下のJSON形式で入力します
{ "NEWRELIC_API_KEY": "YOUR_NEWRELIC_API_KEY", "NEWRELIC_ACCOUNT_ID": "YOUR_NEWRELIC_ACCOUNT_ID" }
- 暗号化キー: デフォルトのまま(
aws/secretsmanager) - 「次へ」をクリック
3. シークレット名の設定
- シークレット名:
NewRelicSecretKey - 説明: New Relic API Key and Account ID(任意)
- 「次へ」をクリック
4. ローテーション設定
- 「自動ローテーションを無効にする」を選択
- 「次へ」をクリック
5. 確認と作成
- 設定内容を確認
- 「保存」をクリック
IAMロール作成
CodeBuild用のIAMロールを作成します。
1. IAMロールの作成
AWSコンソールから「IAM」→「ロール」→「ロールを作成」を選択します。
2. 信頼されたエンティティタイプの選択
- 「AWSのサービス」を選択
- ユースケースで「CodeBuild」を選択
- 「次へ」をクリック
3. 許可ポリシーのアタッチ
以下のAWSマネージドポリシーをアタッチすると素早く検証できます。
AmazonS3FullAccessSecretsManagerReadWriteCloudWatchLogsFullAccess
重要
- 上記のマネージドポリシーは検証用です。本番環境では必ず最小権限の原則に従い、必要なリソースとアクションのみに絞ったカスタムポリシーを作成してください。
- CodeBuildに強い権限を与えすぎるとサプライチェーン攻撃のリスクになるため、本番環境では Secrets Manager の特定ARNへの secretsmanager:GetSecretValue のみを許可するインラインポリシーを使用してください
4. ロール名の設定
- ロール名:
codebuild-newrelic-terraform-role - 説明: New Relic Terraform展開用のCodeBuildロール
5. ロールの作成完了
「ロールを作成」をクリックして完了します。作成したロールのARNは後ほど使用するため、メモしておいてください。
buildspec.ymlの作成
CodeBuildで実行する処理をbuildspec.ymlに定義します。
version: 0.2 phases: install: commands: - wget https://releases.hashicorp.com/terraform/1.13.5/terraform_1.13.5_linux_amd64.zip - unzip terraform_1.13.5_linux_amd64.zip - mv terraform /usr/local/bin/ - terraform --version pre_build: commands: # Secrets Managerから認証情報を取得 - export SECRET_NAME="NewRelicSecretKey" - export TF_VAR_newrelic_api_key=$(aws secretsmanager get-secret-value --secret-id $SECRET_NAME --query SecretString --output text | jq -r .NEWRELIC_API_KEY) - export TF_VAR_newrelic_account_id=$(aws secretsmanager get-secret-value --secret-id $SECRET_NAME --query SecretString --output text | jq -r .NEWRELIC_ACCOUNT_ID) # Terraform初期化 - cd terraform - | if [ "$ENVIRONMENT" = "prod" ]; then terraform init \ -backend-config="bucket=your-terraform-state-bucket-prod" \ -backend-config="key=newrelic/prod/terraform.tfstate" \ -backend-config="region=ap-northeast-1" \ -backend-config="encrypt=true" else terraform init \ -backend-config="bucket=your-terraform-state-bucket-dev" \ -backend-config="key=newrelic/dev/terraform.tfstate" \ -backend-config="region=ap-northeast-1" \ -backend-config="encrypt=true" fi build: commands: - terraform plan -out=tfplan - terraform show -no-color tfplan > plan_output.txt - terraform apply -auto-approve tfplan post_build: commands: - echo "Terraform apply completed" artifacts: files: - terraform/plan_output.txt
重要なポイントを3つ説明します。
環境変数の安全な管理
pre_buildフェーズでSecrets Managerから認証情報を取得し、環境変数として設定します。AWS CLIとjqコマンドを使ってJSON形式のシークレットから必要な値を抽出し、TF_VAR_プレフィックス付きの環境変数として設定することで、Terraformが自動的に変数として認識します。
環境別のbackend設定
ENVIRONMENT環境変数の値に応じて、適切なbackend設定ファイルを使用します。この環境変数はCodeBuildプロジェクトで設定します。
terraform planの出力保存
plan結果をplan_output.txtとして保存し、artifactsとして出力します。これにより、手動承認ステージでplan内容を確認できます。
注意: この例では自動的にterraform applyを実行します。本番環境では、後述する手動承認ステージの追加を検討してください。
CodePipelineの構築
Step 1: 作成オプションを選択する
1. パイプラインの作成開始
AWSコンソールから「CodePipeline」→「Create pipeline」を選択します。
2. 作成オプションの選択
「Step 1: Choose creation option」ページで以下を設定します。
- 作成オプションを選択する: 「カスタムパイプラインを構築する」を選択
- 「次へ」をクリック
Step 2: パイプラインの設定を選択する
1. パイプライン設定
「Step 2: Choose pipeline settings」ページで以下を設定します。
- パイプライン名:
newrelic-terraform-pipeline - サービスロール: 「新しいサービスロール」を選択(自動的に作成されます)
- ロール名: デフォルトのまま
- 「次へ」をクリック
Step 3: ソースステージを追加する
1. ソースプロバイダーの設定
「Step 3: Add source stage」ページで以下を設定します。
- ソースプロバイダー: 「GitHub (GitHubアプリ経由)」を選択
- 接続: 既存の接続がある場合はそれを選択、ない場合は「Create new connection」を選択
GitHub接続の作成(初回のみ)
新しい接続を作成する場合は以下の手順で進めます。
- Connection name:
github-connection(任意の名前) - 「Connect to GitHub」をクリック
- GitHubの認証画面が開くので、AWSアカウントへのアクセスを承認
- リポジトリへのアクセス権限を設定(すべてのリポジトリ、または特定のリポジトリのみ)
- 「Install」をクリックしてGitHubアプリをインストール
- AWSコンソールに戻り、「Connect」をクリック
2. リポジトリとブランチの設定
- リポジトリ名: 対象のGitHubリポジトリを選択
- デフォルトブランチ:
main - 出力アーティファクト形式: 「CodePipeline のデフォルト」を選択
- 「次へ」をクリック
Step 4: ビルドステージを追加する
※パイプラインに手動承認ステージを組み込むこともできますが、本記事では簡易化のため承認ステージの話は割愛しています
1. ビルドステージの設定
「Step 4: ビルドステージを追加する」ページで、以下の設定を行います。
- プロバイダーを構築する: 「その他のビルドプロバイダー」から「AWS CodeBuild」を選択
- プロジェクト名: 既存のプロジェクトがある場合は選択、ない場合は「Create project」をクリック
2. CodeBuildプロジェクトの作成
新しいプロジェクトを作成する場合、以下の設定を行います。
プロジェクトの設定
- プロジェクト名:
newrelic-terraform-build - プロジェクトタイプ: デフォルトプロジェクト
- 説明 - オプショナル: New Relic Terraform設定の展開
環境
- プロビジョニングモデル: オンデマンド
- 環境イメージ: マネージド型イメージ
- コンピューティング: EC2
- 実行モード: コンテナ
- オペレーティングシステム: Amazon Linux
- ランタイム: Standard
- イメージ: aws/codebuild/amazonlinux2-x86_64-standard:5.0(最新版)
- イメージのバージョン: このランタイムバージョンには常に最新のイメージを使用してください
- GPU 強化コンピューティングを使用: チェックなし
- サービスロール: 「既存のサービスロール」を選択
- ロールの ARN: 先ほど作成した
codebuild-newrelic-terraform-roleのARNを入力
追加設定(環境変数)
「追加設定」を展開し、環境変数を追加します。
- 名前:
ENVIRONMENT - 値:
dev(開発環境の場合。本番環境用のプロジェクトではprodを設定) - タイプ: プレーンテキスト
Buildspec
- ビルド仕様: 「buildspec ファイルを使用する」
- Buildspec名 - オプショナル:
buildspec.yml(デフォルト)
ログ
- CloudWatch Logs - オプショナル: 有効化
- グループ名 - オプショナル:
/aws/codebuild/newrelic-terraform-build - ストリーム名のプレフィックス - オプショナル: 空欄(自動生成)
3. プロジェクト作成の完了
「Continue to CodePipeline」をクリックして、CodePipelineの設定画面に戻ります。
4. ビルドステージの設定完了
- Build type: 「Single build」
- 「次へ」をクリック
Step 5: テストステージを追加
1. テストステージのスキップ
「Step 5: テストステージを追加」ページで以下を設定します。
- 「テストステージをスキップ」を選択
- 「次へ」をクリック
Step 6: デプロイステージを追加する
1. デプロイステージのスキップ
「Step 6: デプロイステージを追加する」ページで以下を設定します。
- 「導入段階をスキップ」を選択
- 確認ダイアログで「スキップ」をクリック
- 「次へ」をクリック
Step 7: レビュー
1. パイプラインの作成完了
「Step 7: Review」ページで設定内容を確認し、「パイプラインを作成する」をクリックします。作成後、自動的に最初の実行が開始されます。
手動承認ステージについて
本番環境では、terraform planの結果を確認してからapplyを実行するため、手動承認ステージを追加することを推奨します。Plan専用のCodeBuildプロジェクトを作成し、Planステージ → 手動承認ステージ → Applyステージという流れにすることで、変更内容を確認してから安全にデプロイできます。手動承認アクションではSNS通知と連携することで、承認待ちの通知をメールやSlackで受け取ることも可能です。
複数環境への対応について
開発環境と本番環境で異なるパイプラインを運用する場合は、以下の点を考慮して設定してください。
- 環境ごとに独立したパイプラインを作成し、CodeBuildプロジェクトの環境変数
ENVIRONMENTで環境を識別します - Secrets Managerで環境別のシークレット(
NewRelicSecretKey-dev、NewRelicSecretKey-prodなど)を作成し、buildspec.ymlで${ENVIRONMENT}変数を使って動的に参照します - S3バケットやtfstateのキーも環境ごとに分離し、誤って別環境のstateを参照しないようにします
- ブランチ戦略として、開発環境は
developブランチ、本番環境はmainブランチをトリガーにすると管理しやすくなります - 環境ごとに異なるNew RelicアカウントIDを使用する場合は上記の設定で対応できますが、同一アカウント内で環境を分ける場合は、アラート名やタグでリソースを区別する設計が必要です
SNS通知について
パイプラインの実行結果を通知したい場合は、SNSトピックを作成してCodePipelineの通知ルールと連携できます。メール通知やAWS Chatbotを使ったSlack通知が可能です。
まとめ
AWS CodePipelineとCodeBuildを使ったNew Relic監視設定の自動展開を実装しました。GitHubへのマージをトリガーに、自動的にterraform planとapplyが実行される仕組みにより、AWS環境と統合した形で安全な運用が可能になります。今回は記載していませんが、S3にファイルが保存されたらCI/CDパイプラインをキックするような構成をとることも可能です。
AWSからいきなりIaC管理するのもいいですが、何かあっても影響の小さいNew Relicのような監視ツールからこうした取り組みを実現してみてはいかがでしょうか。
この記事がどなたかのお役に立てれば幸いです。
宣伝
弊社では、お客様環境のオブザーバビリティを加速するためのNew Relicアカウント開設を含めた伴走型のNew Relic導入支援サービスをご提供しております。 もしご興味をお持ちの方は、こちらのお問合せフォームよりお問合せ頂けましたら幸いでございます。