あなたのラムダをterraformでスケジュールする方法?

5330 ワード

定期的にあなたのラムダを定期的にユーザーアクションによって引き起こされることなく実行する必要がある場合があります.例えば、毎月/毎週のベースでお客様にメールを送信しようとしたり、データに対してプロセスを実行したりします.

ラムダ関数の実行は、AWS Event Bridge , ここで、スケジュールで実行し、ラムダをトリガルールを作成します.
イベントブリッジは、ソースから目的地までデータ(またはイベント)を渡すことによって、アプリケーションとサービスを接続するServerlessイベントバスです.このポストでは、イベントブリッジとラムダを設定し、ラムダ関数の実行をスケジュールする規則を設定します.

セットアップインフラストラクチャ
私はしばらくの間Torraformを学びたかったので、私はこのポストが行動にこれを置く優れた機会であると思いました.私がここの初心者であるので、おそらくterraformファイルを書くより良い方法があります、そして、私はどんなフィードバックも評価します.
まず、ラムダ関数にアップロードする簡単なJSコードを作成します.クリエイトアindex.js 次のコードをファイルします
exports.handler  = async (event) => {
  const payload = {
    date: new Date(),
    message: "awesome lambda function",
  };
  return JSON.stringify(payload);
};
第二に、私たちはterraformをインストールしたいと思います.brew tap hashicorp/tap then brew install hashicorp/tap/terraform . 他のオペレーティングシステムについてはdocs .
インフラストラクチャの各部分に少しずつ掘りましょう.クリエイトアmain.tf ファイルは、私たちの地形形態のすべてを含みます(これは複数のファイルとモジュールに分割されるかもしれません、しかし、このポストのために、私はすべての設定を一つのファイルに保ちます).
クラウドプロバイダとしてAWSを定義し、プロファイル名とリソースを設定したい領域を設定します.
provider "aws" {
  profile = "default"
  region  = "ap-southeast-2"
}
ラムダ関数と実行ロールを作成します(これはAWSサービスとリソースにアクセスするための関数の許可を付与するIAMロールです.関数は呼び出され、ログを書き込むか、他のアクションを実行するために使用することができます).
resource "aws_iam_role" "iam_for_lambda" {
  name = "iam_for_lambda"

  # Terraform's "jsonencode" function converts a
  # Terraform expression result to valid JSON syntax.
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Sid    = ""
        Principal = {
          Service = "lambda.amazonaws.com"
        }
      },
    ]
  })
}


resource "aws_lambda_function" "test_lambda" {
  filename      = "schedule-lambda.zip"
  function_name = "test_lambda"
  role          = aws_iam_role.iam_for_lambda.arn
  handler       = "index.handler"

  source_code_hash = filebase64sha256("schedule-lambda.zip")

  runtime = "nodejs12.x"
}
この前のスニペットでは、2つのリソースを定義しましたそれは2つの地形ですresource ブロック、IAMロールの最初のもの、2番目はラムダ関数です.各構成ブロックの前にresource typeresource name . 一緒に、リソースタイプとリソース名は、それを更新するとき、資源を特定するためにterraformが使用できるユニークなIDを形成します.
また、ロール名を示すハンドラー関数を識別し、ファイル名を追加しました.これは、ラムダコードをパッキングするZIPファイルの名前です.そこで、このインフラストラクチャ設定用のコードをパッケージ化する必要があります.次のコマンドを実行します.zip -r ./schedule-lambda.zip index.js .
ここで、イベントブリッジルールの設定を準備し、このルールのターゲットとしてラムダ関数を追加します.
resource "aws_cloudwatch_event_rule" "every_5_minutes" {
  name        = "every_5_minutes_rule"
  description = "trigger lambda every 5 minute"

  schedule_expression = "rate(5 minutes)"
}

resource "aws_cloudwatch_event_target" "lambda_target" {
  rule      = aws_cloudwatch_event_rule.every_5_minutes.name
  target_id = "SendToLambda"
  arn       = aws_lambda_function.test_lambda.arn
}
つの最後のステップは、我々がイベントブリッジ規則に我々のラムダ関数を起動する許可を与えるところですこれはaws_lambda_permission :
resource "aws_lambda_permission" "allow_eventbridge" {
  statement_id  = "AllowExecutionFromEventBridge"
  action        = "lambda:InvokeFunction"
  function_name = aws_lambda_function.test_lambda.function_name
  principal     = "events.amazonaws.com"
  source_arn    = aws_cloudwatch_event_rule.every_5_minutes.arn
}
「アクション」でInvokeFunctionを指定し、関数名とソースを定義する方法

インフラの配備
次のコマンドを実行し、インフラストラクチャを検証して配置します.
  • terraform init 作業ディレクトリを準備するには
  • terraform validate 設定が有効かどうかを調べるには
  • terraform plan 現在の設定で必要な変更を表示するには
  • terraform apply インフラを作成または更新するには
  • 動作していることを確認するには、AWSコンソールにログインし、ラムダ関数を選択し、「モニター」タブをクリックします.実行する前に、次のようになります.

    その後、数分後、期間、エラー、成功率と同時実行に注意してください-これは7時から7時15分までの直線として示しています.実際には、これらは5分ごとに受信された3つの接続点(イベント)です.

    これが役に立つことを願っています.どのように、あなたはラムダ関数の実行を予定しますか?