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

# イベントソース・パイプライン
フロー：DataLake → Glue → QuickSight
CloudWatchに吐き出されたGlueの実行ログを、Lambdaで集計・抽出し、S3バケットへアップロードします。
Lambda関数は、Step Functionで起動させています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/f8780266-a47a-91ee-0ba6-0eb3c5b5785b.png)

## EventBridge （旧：CloudWatch Events）
EventBrightのイベント実行ルールを設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/94d9b6b5-3833-a57d-3092-b3fac05ab9f3.png)
イベントパターンをスケジュール（モード）に設定し、スケジュールに基づいたアクションを設定しています。
これにより定期的にStep Funcitonsを実行し、Lambdaにデータがプッシュされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/2da95b79-a5cb-6607-c90b-43255a249c12.png)
下記がログの中身です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/2621e5bd-4fe0-8c24-4b91-a230359e0d18.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/693c3102-5424-b013-5c2d-7aa91004d55c.png)
ステートマシンとは、次キャプチャのような処理の順番を定義した設定です。
下記はその状態遷移図です。これにより処理の状況、状態を確認・追跡することができます。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/1691da69-2479-b1f7-5796-ea81d9e8a855.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/9efb4f4a-29b0-377e-01f1-d529bd0215ac.png)
※Python boto3については、下記に詳しくまとめられています。（参考）

https://boto3.amazonaws.com/v1/documentation/api/latest/index.html#

Lambdaの実行ログです。Lambda実行時のエラー情報などもこのログから確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/53721738-a20e-f369-39a6-635836c3a8ac.png)
下記はログの中身です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/2a47dfd2-3043-d2b7-9f19-ff8951df677a.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2432928/2de2e41a-a2dd-4d2b-e069-981215bc49f6.png)

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

https://qiita.com/tk_tatsuro/items/94c463c14de89ebbb4d8