terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 4.0.0" } random = { source = "hashicorp/random" version = "~> 3.1.0" } archive = { source = "hashicorp/archive" version = "~> 2.2.0" } } required_version = ">= 0.14.9" } provider "aws" { profile = "default" region = var.aws_region } resource "random_string" "random" { length = 4 special = false } resource "aws_dynamodb_table" "movie_table" { name = var.dynamodb_table billing_mode = "PROVISIONED" read_capacity = 20 write_capacity = 20 hash_key = "year" range_key = "title" attribute { name = "year" type = "N" } attribute { name = "title" type = "S" } } #======================================================================== // lambda setup #======================================================================== resource "aws_s3_bucket" "lambda_bucket" { bucket_prefix = var.s3_bucket_prefix force_destroy = true } resource "aws_s3_bucket_acl" "private_bucket" { bucket = aws_s3_bucket.lambda_bucket.id acl = "private" } data "archive_file" "lambda_zip" { type = "zip" source_dir = "${path.module}/src" output_path = "${path.module}/src.zip" } resource "aws_s3_object" "this" { bucket = aws_s3_bucket.lambda_bucket.id key = "src.zip" source = data.archive_file.lambda_zip.output_path etag = filemd5(data.archive_file.lambda_zip.output_path) } //Define lambda function resource "aws_lambda_function" "apigw_lambda_ddb" { function_name = "${var.lambda_name}-${random_string.random.id}" description = "serverlessland pattern" s3_bucket = aws_s3_bucket.lambda_bucket.id s3_key = aws_s3_object.this.key runtime = "python3.8" handler = "app.lambda_handler" source_code_hash = data.archive_file.lambda_zip.output_base64sha256 role = aws_iam_role.lambda_exec.arn environment { variables = { DDB_TABLE = var.dynamodb_table } } depends_on = [aws_cloudwatch_log_group.lambda_logs] } resource "aws_cloudwatch_log_group" "lambda_logs" { name = "/aws/lambda/${var.lambda_name}-${random_string.random.id}" retention_in_days = var.lambda_log_retention } resource "aws_iam_role" "lambda_exec" { name = "LambdaDdbPost" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [{ Action = "sts:AssumeRole" Effect = "Allow" Sid = "" Principal = { Service = "lambda.amazonaws.com" } } ] }) } resource "aws_iam_policy" "lambda_exec_role" { name = "lambda-tf-pattern-ddb-post" policy = <