見出し画像

Terraform奮闘日記#2

こんにちは!分析屋の加成(かなり)です。
#1ではTerrafromの概要について記載しましたので、Terraform未経験者の人は#1から読んでみてください!!

#1でも記載したように私はAWSを用いて社内の勤怠システムのAPIを開発する業務を行っています。
具体的には下図のようなAWSの構成をTerrafromを用いて構築します。

#2ではTerraformを用いたLambdaの関数の作成方法を具体的に見ていきます!




■Lambdaの関数を作成

概要

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

今回はtest.pyをソースとし、test_functionという関数をLambdaに作成してみます。
作成するファイルは3つです。

  • test.py:Lambdaに作成する関数のソース、今回はtest

  • main.tf:TerraformやAWSの設定を記載したファイル

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


■test.py

今回はサンプルとしてtestを出力するスクリプトを作成しました。

def handler(event, context):
    print('test')


    return()


■main.tf

main.tfはTerraformの設定とAWSの設定を記載します。
Lambdaの関数を作成する上でmain.tfの注意点としてはプロバイダーにarchiveが必要であることです。
TerraformではローカルのPythonスクリプトをzip化して、AWSにデプロイします。
その際のzip化にてachiveが必要となります。

# 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.tfを作成します!
Lambdaの関数を作成するのに必要な要素は3つです。
archive_file
ローカルのスクリプトをzip化するのに必要。
aws_lambda_function
Lambdaに作成する関数の詳細情報を設定するのに必要。
注意点として”runtime”はmain.tfで設定したAWSのプロバイダーのバージョンによって利用可能なruntimeが変わります。
IAM権限の設定
Lambdaを動かすのに必要。今後他のAWSのサービスと連携する際は詳細に設定が必要。
今回はIAM権限の設定についての説明を省きます。

# 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
}

■結果確認


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

実行した結果、、、、、

無事Lambdaにtest_functionが作成されました!
今回はLambdaに着目した記事を書きましたが、次回の#3ではEventBridge Scedulerを用いてLambdaが実行できるコードを書いていきますのでお待ちください!


■複数のソースファイルを用いたLambdaの関数の作成 ※参考

本文は1つの処理(test.py)をもつ関数を作成しましたが、本章では複数の処理をもつ関数を作成します。
コメントアウトで説明を記載しているので見てみてください!!

# スクリプトをリスト化
locals {
  source_files = [
    "./test.py",
    "./test_2.py",
  ]
}

# ソースファイルの数を定義 ※そのままコピペで利用できます。
data "template_file" "t_file" {
  count = "${length(local.source_files)}"
  template = "${file(element(local.source_files, count.index))}"
}

# lambdaのソースコード
data "archive_file" "function_info" {
    type = "zip"
    output_path = "./test.zip"
    # ソースコードを別々に記載
    source {
      filename = "${basename(local.source_files[0])}"
      content = "${data.template_file.t_file.0.rendered}"
    }
    source {
        filename = "${basename(local.source_files[1])}"
        content = "${data.template_file.t_file.1.rendered}"
    }
}

# デプロイ
resource "aws_lambda_function" "test_function" {
  function_name    = "test_function"
  filename         = data.archive_file.function_info.output_path
  source_code_hash = data.archive_file.function_info.output_base64sha256
  runtime          = "python3.12"
  # 同じ名前のポリシーやロールは作成できないので、本文で作成したロールのARNを記載する。
  role             = "本文で作成したロールのARNを入力"
  handler          = "test.handler"
}

上記のコードにlambda.tfを変更すると、、、

test_functionの中に2つの処理が入りました!!

■複数のLambdaの関数を作成

続いて、1度の実行で複数のLambdaの関数を作成します。
複数のLambdaの関数を作成する場合はarchive_fileとaws_lambda_functionを作成する関数分、記載します。

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

# デプロイ
resource "aws_lambda_function" "test_function" {
  function_name    = "test_function"
  filename         = data.archive_file.function_info.output_path
  source_code_hash = data.archive_file.function_info.output_base64sha256
  runtime          = "python3.12"
  role             = "arn:aws:iam::110951567839:role/iam_role_for_lambda"
  handler          = "test.handler"
}

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

# デプロイ
resource "aws_lambda_function" "test_function_2" {
  function_name    = "test_function_2"
  filename         = data.archive_file.function_info_2.output_path
  source_code_hash = data.archive_file.function_info_2.output_base64sha256
  runtime          = "python3.12"
  role             = "arn:aws:iam::110951567839:role/iam_role_for_lambda"
  handler          = "test.handler_2"
}

上記のコードにlambda.tfを変更すると、、、

2つの関数をLambdaに作成することができました!!




株式会社分析屋について

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

ホームページはこちら。

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

【データ分析で日本を豊かに】
分析屋はシステム分野・ライフサイエンス分野・マーケティング分野の知見を生かし、多種多様な分野の企業様のデータ分析のご支援をさせていただいております。 「あなたの問題解決をする」をモットーに、お客様の抱える課題にあわせた解析・分析手法を用いて、問題解決へのお手伝いをいたします!

【マーケティング】
マーケティング戦略上の目的に向けて、各種のデータ統合及び加工ならびにPDCAサイクル運用全般を支援や高度なデータ分析技術により複雑な課題解決に向けての分析サービスを提供いたします。

【システム】
アプリケーション開発やデータベース構築、WEBサイト構築、運用保守業務などお客様の問題やご要望に沿ってご支援いたします。

【ライフサイエンス】
機械学習や各種アルゴリズムなどの解析アルゴリズム開発サービスを提供いたします。過去には医療系のバイタルデータを扱った解析が主でしたが、今後はそれらで培った経験・技術を工業など他の分野の企業様の問題解決にも役立てていく方針です。

【SES】
SESサービスも行っております。

この記事が参加している募集