Conceptual diagram of AWS Log integration with New Relic.

はじめに

New Relic では、AWS 環境からのログ連携を実行するための Lambda 関数として、以下2つのアプリケーションをご提供しています。

  1. CloudWatch ロググループからのログ転送をサポートする aws-log-ingestion
  2. S3 バケットからのログ転送をサポートする aws-log-ingestion-s3

上記の2アプリケーションのランタイムは Python 3.11 でした。現在、多くの環境で利用されている Python 3.11 ですが、AWS のサポートポリシーに基づき、将来的なセキュリティパッチの提供終了を見据えた最新バージョンへの移行が推奨されています。これに合わせ、New Relic が提供するログ収集用 Lambda 関数も Python 3.12 への対応を完了しました。

本記事では、既存の New Relic ログ転送環境を安全に Python 3.12 へアップデートするための手順を解説します。

2つのアプリケーションの機能による区別

New Relic に AWS のログを転送する仕組みには、大きく分けて 2 つの Lambda 関数が存在します。まずは、ご自身の AWS 環境で動作している関数がどちら(あるいは両方)なのかを確認しましょう。

機能名 役割 主な利用ケース 更新対象のリポジトリ/SAR名
log-ingestion CloudWatch Logs から直接転送 Lambda 関数の実行ログや、各種 AWS サービスの標準ログを転送している場合。 NewRelic-log-ingestion
log-ingestion-s3 S3 バケット から転送 ALB のアクセスログ、VPC フローログ、CloudTrail など一度 S3 に保存されるログを転送している場合。 NewRelic-log-ingestion-s3

Check Point: AWS コンソールの Lambda 一覧画面で newrelic-log-ingestion-[ランダム文字列] または NewRelic-s3-log-ingestion という名前の関数を確認し、これらが「ランタイム: Python 3.11」となっている場合、本ガイドの手順で更新が必要です。本ガイドでは、最も一般的と考えられる Serverless Application Repository を利用した更新手順をご案内します。

log-ingestion (CloudWatch Logs 用) の更新手順

Serverless Application Repository を利用して log-ingestion をインストールしている場合には、この項目の手順を実行します。log-ingestion が Serverless Application Repository を経由してインストールされているかの判断には、リージョン内の CloudFormation スタックをご確認いただき、"serverlessrepo" から始まる CloudFormation スタックを探していただくことで判断することが可能です。デフォルトの状態では serverlessrepo-NewRelic-log-ingestion という名前の CloudFormation スタックが作成されます。

マネージメントコンソール経由での更新

  1. AWS のマネージメントコンソールを経由して log-ingestion を更新するためには、まず Serverless Application Repository のマネージメントコンソールに遷移します。
  2. 左ペインから available applications を選択します。
  3. Public Application のタブを選択し、検索ボックスに "newrelic" と入力、"Show apps that create custom IAM roles or resource policies" のチェックボックスをチェックします。現れた選択肢から、"NewRelic-log-ingestion" を選択します
  4. 遷移した画面で、Application name(CloudFormation スタック名から serverlessrepo を削除)、FunctionRole、NRLicenseKey を CloudFormation スタックに設定されたものと同一のものを入力します
  5. Deploy ボタンを押し、変更セットの作成と実行が完了したら更新完了です。

コマンドを利用した更新

本項目の手順では、アップデートに AWS CLI を利用しますが、Serverless Application 作成時に指定したパラメータ(スタックパラメータに指定した内容)により、更新に利用するコマンドに違いが生じます。Serverless Application 作成時に FunctionRole パラメータが指定されたかどうかは、CloudFormation スタックの Parameters の項目を確認し、FunctionRole が空欄であるかどうかをご確認ください。

FunctionRole を指定しない場合のコマンドは以下です。

aws serverlessrepo create-cloud-formation-change-set \
   --application-id arn:aws:serverlessrepo:us-east-1:463657938898:applications/NewRelic-log-ingestion \
   --stack-name <スタック名から "serverlessrepo-" を削除したもの> \
   --capabilities CAPABILITY_RESOURCE_POLICY CAPABILITY_IAM \
   --parameter-overrides Name=NRLicenseKey,Value=<New Relic ライセンスキー> \
   --region <AWS リージョン>

続いて、FunctionRole を作成時に指定した場合のコマンドは以下です。--parameters オプションに FunctionRole に関する値が入力されている点にご注意ください。

aws serverlessrepo create-cloud-formation-change-set \
   --application-id arn:aws:serverlessrepo:us-east-1:463657938898:applications/NewRelic-log-ingestion \
   --stack-name <スタック名から "serverlessrepo-" を削除したもの>  \
   --capabilities CAPABILITY_RESOURCE_POLICY CAPABILITY_IAM \
   --parameter-overrides Name=NRLicenseKey,Value=<New Relic ライセンスキー> Name=FunctionRole,Value=<FunctionRole で指定した値> \
   --region <AWS リージョン>

上記により、CloudFormation スタックに変更セット(Change Set)が作成されます。コマンドの出力例は以下のような形になります。

{
    "ApplicationId": "arn:aws:serverlessrepo:us-east-1:463657938898:applications/NewRelic-log-ingestion",
    "ChangeSetId": "<Change Set の ARN>",
    "SemanticVersion": "2.10.0",
    "StackId": "<CloudFormation スタックの ARN>"
}

次に作成された変更セットを実行します。変更セットの実行のためには、以下2通りの方法があります。

  1. CloudFormation マネージメントコンソールから該当する CloudFormation スタックの詳細画面を表示し、Change Sets の項目から作成された変更セットを実行する
  2. AWS CLI で以下のコマンドを実行する
aws cloudformation execute-change-set --change-set-name <上記のコマンド出力中 ChangeSetId の値> --region <AWS リージョン>

変更セットの実行状況が EXECUTE_COMPLETE になれば更新は完了です。

log-ingestion-s3 (S3 用) の更新手順

続いて、本項目では log-ingestion-s3 の更新手順を示します。

マネージメントコンソール経由での更新

マネージメントコンソール経由での更新手順は、ほぼ log-ingestion の場合と同様です。

  1. AWS のマネージメントコンソールを経由して log-ingestion-s3 を更新するためには、まず Serverless Application Repository のマネージメントコンソールに遷移します。
  2. 左ペインから available applications を選択します。
  3. Public Application のタブを選択し、検索ボックスに "newrelic" と入力、"Show apps that create custom IAM roles or resource policies" のチェックボックスをチェックします。現れた選択肢から、"NewRelic-log-ingestion-s3" を選択します
  4. 遷移した画面で、Application name(CloudFormation スタック名から serverlessrepo を削除)、FunctionRole、NRLicenseKey を CloudFormation スタックに設定されたものと同一のものを入力します
  5. Deploy ボタンを押し、変更セットの作成と実行が完了したら更新完了です。

コマンドを利用した更新

コマンドでの更新手順も概ね log-ingestion の場合と同様となりますが、実行するコマンドの --application-id オプションが異なる点にご注意ください。

aws serverlessrepo create-cloud-formation-change-set \
   --application-id arn:aws:serverlessrepo:us-west-2:533243300146:applications/NewRelic-log-ingestion-s3 \
   --stack-name <スタック名から "serverlessrepo-" を削除したもの>  \
   --capabilities CAPABILITY_RESOURCE_POLICY CAPABILITY_IAM \
   --parameter-overrides Name=NRLicenseKey,Value=<New Relic ライセンスキー> \
   --region <AWS リージョン>

上記により、CloudFormation スタックに変更セット(Change Set)が作成されます。コマンドの出力例は以下のような形になります。

{
    "ApplicationId": "arn:aws:serverlessrepo:us-west-2:533243300146:applications/NewRelic-log-ingestion-s3",
    "ChangeSetId": "<Change Set の ARN>",
    "SemanticVersion": "1.3.0",
    "StackId": "<CloudFormation スタックの ARN>"
}

次に作成された変更セットを実行します。変更セットの実行のためには、以下2通りの方法があります。

  1. CloudFormation マネージメントコンソールから該当する CloudFormation スタックの詳細画面を表示し、Change Sets の項目から作成された変更セットを実行する
  2. AWS CLI で以下のコマンドを実行する
aws cloudformation execute-change-set --change-set-name <上記のコマンド出力中 ChangeSetId の値> --region <AWS リージョン>