【tfdevops】Terraformで作成したリソースをAmazon DevOps Guruで監視する。

2022.02.10

こんにちは! AWS事業本部コンサルティング部のたかくにです。

今回は、Terraformで作成したリソースでも、Amazon DevOps Guruの監視対象にしたいと思います。

結論

  • tfdevopsはTerraformからCloudFormationへの変換ツールではない
  • 発展途中のツールであるため今後に期待!

Amazon DevOps Guruとは

ざっくりご説明すると、CloudWatch, Config, CloudTrail, X-Rayをデータソースに、機械学習を利用して異常な運用アクティビティを検知、是正方法をアドバイスするサービスです。

Amazon DevOps Guru for RDSは、拡張機能として、解決まで行うサービスとなっております。

AWS公式:Amazon DevOps Guru

弊社ブログ:【簡単導入】機械学習で運用を効率化!Amazon DevOps Guruを有効化してみた

弊社ブログ:[速報] Auroraのパフォーマンスの問題を特定するAmazon DevOps Guru for RDS が発表されました! #reinvent

分析カバレッジについて

Amazon DevOps Guruでは、「分析カバレッジ」を使用して監視するリソースを設定します。

2022年2月10日現在、分析カバレッジとして、指定可能なオプションは以下の通りです。

  • All account resources:アカウント内の全てのリソースを監視
  • CloudFormation スタック:スタックを選択し、スタック内で作成されたリソースを監視
  • Tags:「Devops-Guru-」から始まるタグを選択してリソースを監視
  • None:監視しない

Terraformユーザーの選択肢問題

上記のオプションだと、Terraformユーザーは、「CloudFormationスタック」ベースで監視できないです。

今回、tfdevopsを使用して、Terraformで作成したリソースを、「CloudFormationスタック」ベースで監視してみようと思います。

tfdevopsとは

stacklet社が作成したオープンソースのツールです。

tfstateを、インポート可能なCloudFormationスタックに変換し、DevOps Guruが監視できるように設定するツールです。

再度記載しますが、tfdevopsは「TerraformからCloudFormationへの変換ツール」ではありません。

tfdevops

サポートされているリソースについて

2022年2月10日現在、バージョンは0.1.1と伸びしろ満載のツールです。

サポートされているリソースは以下の通りです。

  • AWS::StepFunctions::StateMachine
  • AWS::ECS::Service
  • AWS::SQS::Queue
  • AWS::SNS::Topic
  • AWS::RDS::DBInstance
  • AWS::Lambda::Function
  • AWS::Events::Rule
  • AWS::DynamoDB::Table

いざ実践

インストール

まずは、tfdevopsをインストールします。

pip install tfdevops

監視するリソースを作成

Terraformで監視するリソースを作成し、tfstateを作っていきます。

※今回、サポートされていないリソースの挙動も、確認するためIAMロールを作成しています。

main.tf

# Create a DynamoDB table
resource "aws_dynamodb_table" "sample_dynamodb_table" {
  name           = "sample_dynamodb_table"
  hash_key       = "sampleHashKey"
  billing_mode   = "PAY_PER_REQUEST"

  attribute {
    name = "sampleHashKey"
    type = "S"
  }
}

# IAM role for the dynamodb
resource "aws_iam_role" "dynamodb_role" {
  name   = "iam_role_dynamodb_replication"
  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "replication.dynamodb.amazonaws.com"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
EOF
}

terraform applyでリソースを作成します。

% terraform apply

tfdevops cfn

【tfdevopsとは】の構成図で②、③の工程に入ります。

tfdevops cfnコマンドは、tfstateファイルからインポート可能なリソースを読み込み、テンプレートファイルを作成します。

% tfdevops cfn -d . -t template.json -r import_info.json
  • -d:terraformを実行したディレクトリを指定
  • -t:作成するテンプレートファイルの名前を指定
  • -r:作成する既存リソースのインポート時に必要となるファイルの名前を指定

ファイルは、json形式で作成されます。

一緒に作成したIAMロールは、サポートされていないためテンプレートには出力されませんでした。

また、Importする前提なので、DeletionPolicyRetainで作成されていることに注意です。

template.json

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "TF to CFN Guru Meditation Ops",
  "Resources": {
    "SampleDynamodbTable": {
      "Type": "AWS::DynamoDB::Table",
      "DeletionPolicy": "Retain",
      "Properties": {
        "BillingMode": "PAY_PER_REQUEST",
        "TableName": "sample_dynamodb_table",
        "KeySchema": [
          {
            "AttributeName": "sampleHashKey",
            "KeyType": "HASH"
          }
        ],
        "AttributeDefinitions": [
          {
            "AttributeName": "sampleHashKey",
            "AttributeType": "S"
          }
        ]
      }
    }
  }
}

import_info.json

[
  {
    "ResourceType": "AWS::DynamoDB::Table",
    "LogicalResourceId": "SampleDynamodbTable",
    "ResourceIdentifier": {
      "TableName": "sample_dynamodb_table"
    }
  }
]

tfdevops deploy

【tfdevopsとは】の構成図で④、⑤の工程に入ります。

tfdevops deployでは、既存リソースのインポートスタック作成、分析カバレッジの登録を行います。

% tfdevops deploy -t template.json -r import_info.json
INFO:botocore.credentials:Found credentials in shared credentials file: ~/.aws/credentials
INFO:tfdevops:Creating import change set, 1 resources to import
INFO:tfdevops:Executing change set to import resources
INFO:tfdevops:Waiting for import to complete
INFO:tfdevops:Cloudformation Stack Deployed - Terraform resources imported
INFO:tfdevops:Enrolling terraform stack into devops guru
  • -t:テンプレートファイルのパス指定
  • -r:インポート処理に必要なファイルのパス指定
  • --no-guru:DevOps Guruで監視せず既存リソースのインポートのみ行う

リソースの確認

CloudFormationスタックから確認してみます。

無事、インポートできていることがわかりました。

リソースの論理IDが、TerraformのリソースIDを、よしなに変換しているところが、少し面白いなと感じました。

DevOps Guruでも、作成したスタックが分析カバレッジとして登録されていることが確認できました。

Q.S3にtfstate保管していても実行可能か

A. はい、可能でした。

初め、ローカルにtfstateを保管していましたが、ふと気になったので試したところ問題なくインポートできました。

参考情報

AWS DevOps Blog Monitor AWS resources created by Terraform in Amazon DevOps Guru using tfdevops

まとめ

サポートされているリソースは、まだまだ多いとは言い切れないですがとても画期的なツールだと思いました。

個人的には、デプロイはTerraformでやっちゃったけど、CloudFormationで管理したい(変更セットやりたい!)時に、ご提案できるようなツールにも進化しないかなと淡い期待を込めております。

以上、AWS事業本部コンサルティング部のたかくにでした!