【New Relic】AWS CDK と CDK for Terraform で AWS インテグレーションを作成する

# 概要
本稿では AWS CDK と CDK for Terraform (CDKTF) を使って AWS インテグレーションを作成する方法をご紹介します。

:::note warn
想定読者
* 既に AWS CDK を運用している
* 新たに New Relic で AWS インテグレーションを作成したい
* CDK の開発体験を他クラウドプロバイダに拡張したい
:::

# やること
Terraform を使用した AWS インテグレーションの公式サンプルがありますので、これを参考に AWS サイドは `AWS CDK`、New Relic サイドは `CDKTF` を使ってインテグレーションに必要なリソースを作成します。

https://github.com/newrelic/terraform-provider-newrelic/blob/main/examples/cloud-integrations-aws.tf

# ソースコード
https://github.com/sasamuku/cdk-newrelic-aws-integration

:::note warn
注意事項
AWS と New Relic の間で API Key や ARN などの値の受け渡しが発生します。本稿では Systems Manager Parameter Store を利用してコード上に秘匿情報が出現しないようにしていますが、tfstate や CloudFormation パラメータには平文で格納されるため取り扱いには十分ご注意ください。
:::

# 手順
大まかな流れは次の通りです。

* New Relic から User API Key を取得
* New Relic で AWS に提供する LICENSE Key を生成
* AWS で IAM Role や Firehose Derivery Stream を構成
* New Relic で AWS Link Account を作成

:::note
以下では、New Relic での操作と AWS での操作を区別するため色分けしています
🟢 New Relic
🟠 AWS
:::

### 🟢 User API Key を取得する
New Relic provider を設定するために User API Key を取得します。
取得手順は[ドキュメント](https://docs.newrelic.com/jp/docs/apis/intro-apis/new-relic-api-keys/)を参考にしてください。

こちらは New Relic Terraform Provider の設定に利用します。 
通常は `NRAK` というプレフィックスの Key 値となります。

### 🟠 Parameter Store に格納する
本稿では AWS と New Relic の間の値の受け渡しに Parameter Store を利用します。
取得した User API Key を下記の設定で Parameter Store に格納します。

```
名前: /${env}/cdktf/newrelic/api_key_for_provider
種類: SecureString
データ型: text
```


### 🟢 AWS に提供する LICENSE Key を生成
ここから CDKTF で New Relic にリソースを作成していきます。
まずは AWS に提供する LICENSE Key を生成します。
同時に Remote Backend と Provider 関連の設定も行います。

```ts:main.ts(一部抜粋)
class NewrelicStack extends TerraformStack {
  constructor(scope: Construct, id: string, config: NewrelicStackConfig) {
    super(scope, id);

    // remote backendにS3を利用する場合
    new S3Backend(this, {
      bucket: `cdktf-remote-backend-${config.envName}`,
      key: `${config.envName}/newrelic`,
      region: "ap-northeast-1"
    })

    new AwsProvider(this, "AWS", {
      region: "ap-northeast-1",
    });

    // 手動作成したUser API KeyをSystems Manager Parameter Store経由で取得する
    const apiKeyForProvider = new DataAwsSsmParameter(this, 'ApiKeyForProviderParameterData', {
      name: `/${config.envName}/cdktf/newrelic/api_key_for_provider`,
    });

    new NewrelicProvider(this, "New Relic", {
      accountId: config.newrelicAccountId,
      apiKey: apiKeyForProvider.value,
      region: "US",
    });

    // AWS(Amazon Kinesis Data Firehose)に渡すLICENSE Keyを生成
    const apiKeyForFirehose = new ApiAccessKey(this, "ApiKeyForFirehose", {
      name: "Ingest License key",
      notes: "For AWS Cloud Integrations (Used in Firehose)",
      accountId: config.newrelicAccountId,
      keyType: "INGEST",
      ingestType: "LICENSE",
    });

    // 作成したLICENSE KeyをSystems Manager Parameter Storeに格納する
    new SsmParameter(this, "ApiKeyForFirehoseParameter", {
      name: `/${config.envName}/cdktf/newrelic/api_key_for_firehose`,
      type: 'String',
      value: apiKeyForFirehose.key
    });
  }
}
```

次のコマンドを実行して Deploy してください。

```
❯ cdktf deploy newrelic-sample
```

### 🟠 IAM Role や Firehose Derivery Stream を構成
AWS (AWS CDK) で IAM Role や Firehose Derivery Stream といったデータ連携に必要なリソースを作成します。
[こちら](https://github.com/sasamuku/cdk-newrelic-aws-integration/blob/main/aws-cdk/lib/newrelic-integrations-stack.ts)のリソースを次のコマンドを実行して Deploy してください。

```
❯ cdk deploy NewrelicIntegrationsStack
```

これで AWS サイドの準備は完了です。

### 🟢 AWS Link Account を作成
最後に New Relic (CDKTF) で AWS Link Account を作成します。

```ts:main.ts(一部抜粋)
class NewrelicStack extends TerraformStack {
  constructor(scope: Construct, id: string, config: NewrelicStackConfig) {
    super(scope, id);

    // AWS CDKで作成したRoleのArnをSystems Manager Parameter Store経由で取得する
    const newrelicAwsRoleArnParameter = new DataAwsSsmParameter(this, 'NewrelicAwsRoleArnParameterData', {
      name: `/${config.envName}/newrelic_integrations/newrelic_aws_role/arn`,
    });

    new CloudAwsLinkAccount(this, "NewrelicCloudIntegrationPush", {
      name: "Sample Integration",
      metricCollectionMode: "PUSH",
      arn: newrelicAwsRoleArnParameter.value,
    })
  }
}

```

次のコマンドを実行して Deploy してください。

```
❯ cdktf deploy newrelic-sample
```

以上で作業完了です。

# 確認方法
[one.newrelic.com](one.newrelic.com) > Infrastructure > AWS の順にコンソールを移動し、下記のような表示があれば問題なく連携ができています。

```
180 metrics from 19 namespaces received from AWS account xxxxxxxx with 0 errors.
```

# 参考
https://docs.newrelic.com/jp/docs/infrastructure/amazon-integrations/connect/connect-aws-new-relic-infrastructure-monitoring/

https://github.com/newrelic/terraform-provider-newrelic/blob/main/examples/cloud-integrations-aws.tf

https://developer.hashicorp.com/terraform/cdktf/concepts/stacks