LoginSignup
0
0

More than 1 year has passed since last update.

イベントソース・パイプライン

Last updated at Posted at 2022-01-14

イベントソース・パイプライン

フロー:DataLake → Glue → QuickSight
CloudWatchに吐き出されたGlueの実行ログを、Lambdaで集計・抽出し、S3バケットへアップロードします。
Lambda関数は、Step Functionで起動させています。
image.png

EventBridge (旧:CloudWatch Events)

EventBrightのイベント実行ルールを設定しています。
image.png
イベントパターンをスケジュール(モード)に設定し、スケジュールに基づいたアクションを設定しています。
これにより定期的にStep Funcitonsを実行し、Lambdaにデータがプッシュされます。
image.png
下記がログの中身です。
image.png

Glueの実行ログをLambda関数でS3バケットへアップロードしていきます。

terraform/moduls/cloudwatch/cloudwatch.tf
# ----------------------------------
# Eventbridge (Cloud Watch Events)
# ----------------------------------
resource "aws_cloudwatch_event_rule" "cloudwatch_lambda_test_rule" {
    name                = "cloudwatch-lambda-test-rule"
    schedule_expression = "cron(0/60 * * * ? *)"
}
resource "aws_cloudwatch_event_target" "cloudwatch_lambda_test_target" {
    rule      = "${aws_cloudwatch_event_rule.cloudwatch_lambda_test_rule.name}"
    target_id = "lambda_test"
    arn       = "${aws_lambda_function.lambda_test.arn}"
}
resource "aws_lambda_permission" "cloudwatch_lambda_test_permission" {
    statement_id  = "AllowExecutionFromCloudWatch"
    action        = "lambda:InvokeFunction"
    function_name = "${aws_lambda_function.lambda_test.function_name}"
    principal     = "events.amazonaws.com"
    source_arn    = "${aws_cloudwatch_event_rule.cloudwatch_lambda_test_rule.arn}"
}

resource "aws_cloudwatch_event_rule"で、イベントルールを設定しています。
resource "aws_cloudwatch_event_target"で、実行対象を設定しています。
resource "aws_lambda_permission"で、Lambda関数に対する最低限のアクセス権限を設定しています。

Step Functions

Step Functionsのステートマシンとその実行結果です。
image.png
ステートマシンとは、次キャプチャのような処理の順番を定義した設定です。
下記はその状態遷移図です。これにより処理の状況、状態を確認・追跡することができます。
image.png

実行ログはステップ毎に吐き出されるCloudWatchログから確認できます。

terraform/modules/sfn/sfn.tf
# ----------------------------------
# Stete machine
# ----------------------------------
resource "aws_sfn_state_machine" "sfn" {
  name     = "${var.enviroment}-sfn"
  role_arn = "${aws_iam_role.sfn.arn}"
  definition = <<EOT
  {
    "Comment": "Export Cloudwatch LogStream recursively",
    "StartAt": "Export logs to S3",
    "TimeoutSeconds": 60,
    "States": {
      "Export logs to S3": {
        "Type": "Task",
        "Resource": "${var.lambda_test_arn}",
        "Next": "Finished process ?"
      },
      "Finished process ?": {
        "Type": "Choice",
        "Choices": [
          {
            "Variable": "$.status",
            "StringEquals": "running",
            "Next": "Wait and refuse"
          },
          {
            "Variable": "$.status",
            "StringEquals": "completed",
            "Next": "Success"
          }
        ]
      },
      "Wait and refuse": {
        "Type": "Wait",
        "Seconds": 5,
        "Next": "Export logs to S3"
      },
      "Success": {
        "Type": "Succeed"
      }
    }
  }
EOT
  logging_configuration {
    log_destination = "${var.sfn_arn}"
    include_execution_data = true
    level                  = "ALL"
  }
}

resource "aws_sfn_state_machine"で、Step Functionsのステートマシンの定義をします。
Statesパラメータの配列で、ステップをひとつひとつ定義していきます。
Nextで次のステップを指定できます。
Typeは実行タイプです。例えば「Choice」を設定した場合、後続処理を分岐させることができます。
If~else文と同様の動きをするイメージです。「StringEquals」が分岐条件です。Lambda関数からの返り値(returnされる値)を一致・不一致を判定させています。

Lambda + CloudWatch Logs

Lambda関数を登録しています。
抽出する時間幅を指定して、S3バケットへログファイルをアップロードさせています。
image.png
※Python boto3については、下記に詳しくまとめられています。(参考)

Lambdaの実行ログです。Lambda実行時のエラー情報などもこのログから確認することができます。
image.png
下記はログの中身です。
image.png

terraform/modules/lambda/lambda.tf
# ----------------------------------
# Lambda function
# ----------------------------------
# Generate an empty Lambda file
data "archive_file" "initial_lambda_package" {
  type        = "zip"
  output_path = "./src/.temp_files/lambda.zip"
  source {
    content  = "# empty"
    filename = "main.py"
  }
}

# Upload Lambda files to S3
resource "aws_s3_bucket_object" "lambda_file" {
  bucket = "${var.s3_private_bucket}"
  key    = "initial.zip"
  source = "./src/.temp_files/lambda.zip"
}

# Generate a Lambda function
# Refer to the Lambda file placed on S3
resource "aws_lambda_function" "lambda_test" {
  function_name     = "lambda_test"
  role             = "${aws_iam_role.lambda.arn}"
  handler           = "main.handler"
  runtime           = "python3.8"
  timeout           = 60
  publish           = true
  s3_bucket         = "${var.s3_private_bucket}"
  s3_key            = "${aws_s3_bucket_object.lambda_file.id}"
}

resource "aws_lambda_function"で、Lambda関数の定義をしています。
handlerは「ファイル名.Lambda関数の関数名」を設定しています。
「main.pyファイルのhandler関数を実行してね」という意味です。

S3

指定のS3バケットのディレクトリ配下にログファイルが吐き出されていることがわかります。
image.png

索引ページ

下記でTerraformに関するテーマをまとめて紹介しています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0