見出し画像

Terraform奮闘日記#3

こんにちは!分析屋の加成(かなり)です。
私はAWSを用いて社内の勤怠システムのAPIを開発する業務を行っています。
具体的には下図のようなAWSの構成をTerrafromを用いて構築します。

これまでにもTerraformについての記事を書いていますのでぜひチェックしてみてください!

#1:Terraformのメリットや使い方
Terrafromのメリットや使い方について記載しましたので、Terraform未経験者の人は#1から読んでみてください!!

#2:AWSのLambda関数をTerraformにて作成
実際にTerraformを使って、AWSのLambda関数を作成してみました!




#3ではEventBridge SchedulerをTerraformを用いて作成します!!

■EventBridge Schedulerを作成

概要

まず、今回Terraformを用いてLambda関数を起動するEventBridge Schedulerを作成するイメージです。

今回は例として#2で作成したtest_functionというLambda関数を起動するEventBridge Scheduler(test_schedule)を作成します。
作成するファイルは3つです。

  • main.tf:Terraformの詳細設定

  • lambda.tf:Lambdaに作成する関数の詳細情報、LambdaのIAM権限設定

  • eventbridge.tf:EventBridgeの詳細情報やIAM権限設定


■main.tf

EventBridge Schedulerを作成するために特に追加で設定するブロックはないため、詳細を確認する場合は#2を確認してください。
スクリプトは以下となります。

# Terraformの環境設定
terraform {
    required_providers {
        # セットアップするプロバイダーを記載
        aws = {
            source = "hashicorp/aws"
            version = "~> 5.00"
        }
        # ローカルのスクリプトをzip化する際に必要
        archive = {
            source  = "hashicorp/archive"
            version = "2.4.0"
        }
    }
    required_version = ">= 1.2.0"
}

# awsの設定
provider "aws" {
    region = "us-west-1"


■lambda.tf

Lambdaについても#2の振り返りとなりますので、詳細な内容は#2をチェックしてみてください!
ちなみにLambdaはtest_functionという名前の関数を作成します。
スクリプトは以下となります。

# lambdaのソースコード
data "archive_file" "function_info" {
    type = "zip"
    source_file = "./test.py"
    output_path = "./test.zip"
}

# デプロイ
resource "aws_lambda_function" "test_function" {
  # Lambdaに作成される関数の名前
  function_name    = "test_function"
  # zipファイルのパス 
  filename         = data.archive_file.function_info.output_path
 source_code_hash = data.archive_file.function_info.output_base64sha256
  # 使用するPythonのバージョン
  runtime          = "python3.12"
  role             = aws_iam_role.iam_role_for_lambda.arn
  handler          = "test.handler"
}

# lambda用のIAMロールの設定
data "aws_iam_policy_document" "lambda_assume_role" {
    statement {
        effect = "Allow"
        principals {
            type        = "Service"
            identifiers = ["lambda.amazonaws.com"]
        }
        actions = ["sts:AssumeRole"]
    }  
}

resource "aws_iam_role" "iam_role_for_lambda" {
    name = "iam_role_for_lambda"
    assume_role_policy = data.aws_iam_policy_document.lambda_assume_role.json
}

# lambda用のIAMポリシーの定義
data "aws_iam_policy" "iam_policy_AWSLambda_FullAccess" {
    arn = "arn:aws:iam::aws:policy/AWSLambda_FullAccess"
}

resource "aws_iam_policy" "iam_policy_AWSLambda_FullAccess" {
    name = "iam_policy_for_lambda"
    policy = data.aws_iam_policy.iam_policy_AWSLambda_FullAccess.policy
}

# IAMロールへポリシーをアタッチ
resource "aws_iam_role_policy_attachment" "lambda_policy" {
    role = aws_iam_role.iam_role_for_lambda.name
    policy_arn = aws_iam_policy.iam_policy_AWSLambda_FullAccess.arn
}


■eventvridge.tf

さて、続いては今回の本題であるeventbridge.tfを作成します!
EventBridge Schedulerを作成するのに必要な要素は3つです。
aws_iam_policy_document
Lambda関数を起動するのに必要。
aws_scheduler_schedule
EventBridge Schedulerの詳細設定を記載
・schedule_expressionにcron式を設定する。この設定のスケジュールでLambda関数は起動されます。
・targetにlambda関数(test_function)のARNを設定する。また、EventbridgeからLambda関数を起動するIAMロールが必要となります。

data "aws_iam_policy_document" "eventbridge_scheduler_custom" {
  statement {
    effect = "Allow"

       actions = [
      "lambda:InvokeFunction",
    ]

      resources = [
      "*",
    ]
  }
}

resource "aws_scheduler_schedule" "eventbridge_schedule" {
  name = "test_scheduler" # eventbridge scheduleの名前
  description = "テストスケジュール" # eventbridge scheduleの説明
  state = "ENABLED" # 有効か可能かを設定
  schedule_expression = "cron(0 9 L * ? *)" # 起動するスケジュール
  schedule_expression_timezone = "Asia/Tokyo" # スケジュールのタイムゾーン

  flexible_time_window {
    mode = "OFF"
  }

  target {
    arn      = aws_lambda_function.test_function.arn
    role_arn = "********"
  }
}


■結果確認


では実際に上記のコードを用いてAWSに環境構築してみましょう!
コマンドプロンプトで順番にコマンドを実行します。
terraform init
main.tfにて設定したプロバイダーをインストール
terraform plan
applyした場合のシミュレーション。エラーが出力されたら、コードの見直し
terraform apply
実際にAWSに環境構築

実行した結果、、、、、

無事EventBridgeにtest_schedulerが作成されました!
また、中身もTerraformに記載した通りにスケジュールとターゲットが設定されています!

次回の#4ではIAMポリシーとIAMロールの作成方法を記載いたしますので、お待ちください!




ここまでお読みいただき、ありがとうございました!
この記事が少しでも参考になりましたら「スキ」を押していただけると幸いです!

株式会社分析屋について

弊社が作成を行いました分析レポートを、鎌倉市観光協会様HPに掲載いただきました。

ホームページはこちら。

noteでの会社紹介記事はこちら。

【データ分析で日本を豊かに】
分析屋はシステム分野・ライフサイエンス分野・マーケティング分野の知見を生かし、多種多様な分野の企業様のデータ分析のご支援をさせていただいております。 「あなたの問題解決をする」をモットーに、お客様の抱える課題にあわせた解析・分析手法を用いて、問題解決へのお手伝いをいたします!
【マーケティング】
マーケティング戦略上の目的に向けて、各種のデータ統合及び加工ならびにPDCAサイクル運用全般を支援や高度なデータ分析技術により複雑な課題解決に向けての分析サービスを提供いたします。
【システム】
アプリケーション開発やデータベース構築、WEBサイト構築、運用保守業務などお客様の問題やご要望に沿ってご支援いたします。
【ライフサイエンス】
機械学習や各種アルゴリズムなどの解析アルゴリズム開発サービスを提供いたします。過去には医療系のバイタルデータを扱った解析が主でしたが、今後はそれらで培った経験・技術を工業など他の分野の企業様の問題解決にも役立てていく方針です。
【SES】
SESサービスも行っております。