lambda.tf 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. # ============================================================
  2. # Lambda Layer (shared dependencies)
  3. # ============================================================
  4. resource "aws_lambda_layer_version" "deps" {
  5. filename = "${path.module}/../lambdas/layer.zip"
  6. layer_name = "${local.prefix}-deps"
  7. compatible_runtimes = ["python3.12"]
  8. source_code_hash = filebase64sha256("${path.module}/../lambdas/layer.zip")
  9. }
  10. # ============================================================
  11. # IAM Role for Lambdas
  12. # ============================================================
  13. resource "aws_iam_role" "lambda" {
  14. name = "${local.prefix}-lambda-role"
  15. assume_role_policy = jsonencode({
  16. Version = "2012-10-17"
  17. Statement = [{
  18. Action = "sts:AssumeRole"
  19. Effect = "Allow"
  20. Principal = { Service = "lambda.amazonaws.com" }
  21. }]
  22. })
  23. }
  24. resource "aws_iam_role_policy" "lambda" {
  25. name = "${local.prefix}-lambda-policy"
  26. role = aws_iam_role.lambda.id
  27. policy = jsonencode({
  28. Version = "2012-10-17"
  29. Statement = [
  30. {
  31. Effect = "Allow"
  32. Action = ["logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents"]
  33. Resource = "arn:aws:logs:*:*:*"
  34. },
  35. {
  36. Effect = "Allow"
  37. Action = ["s3:PutObject", "s3:GetObject", "s3:DeleteObject"]
  38. Resource = "${aws_s3_bucket.media.arn}/*"
  39. },
  40. {
  41. Effect = "Allow"
  42. Action = ["dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:Scan"]
  43. Resource = [aws_dynamodb_table.users.arn, aws_dynamodb_table.jobs.arn]
  44. },
  45. {
  46. Effect = "Allow"
  47. Action = ["transcribe:StartTranscriptionJob", "transcribe:GetTranscriptionJob"]
  48. Resource = "*"
  49. },
  50. {
  51. Effect = "Allow"
  52. Action = ["ssm:GetParameter", "ssm:GetParameters"]
  53. Resource = "arn:aws:ssm:${var.aws_region}:*:parameter/${local.prefix}/*"
  54. },
  55. {
  56. Effect = "Allow"
  57. Action = ["states:StartExecution"]
  58. Resource = aws_sfn_state_machine.pipeline.arn
  59. },
  60. ]
  61. })
  62. }
  63. # ============================================================
  64. # Lambda Functions
  65. # ============================================================
  66. locals {
  67. lambda_env = {
  68. PROJECT = local.prefix
  69. S3_BUCKET = aws_s3_bucket.media.id
  70. USERS_TABLE = aws_dynamodb_table.users.name
  71. JOBS_TABLE = aws_dynamodb_table.jobs.name
  72. SSM_PREFIX = "/${local.prefix}"
  73. }
  74. }
  75. resource "aws_lambda_function" "submit" {
  76. filename = "${path.module}/../lambdas/submit.zip"
  77. function_name = "${local.prefix}-submit"
  78. role = aws_iam_role.lambda.arn
  79. handler = "submit.handler"
  80. runtime = "python3.12"
  81. timeout = 30
  82. source_code_hash = filebase64sha256("${path.module}/../lambdas/submit.zip")
  83. layers = [aws_lambda_layer_version.deps.arn]
  84. environment {
  85. variables = merge(local.lambda_env, {
  86. STATE_MACHINE = aws_sfn_state_machine.pipeline.arn
  87. })
  88. }
  89. }
  90. resource "aws_lambda_function" "download" {
  91. filename = "${path.module}/../lambdas/download.zip"
  92. function_name = "${local.prefix}-download"
  93. role = aws_iam_role.lambda.arn
  94. handler = "download.handler"
  95. runtime = "python3.12"
  96. timeout = 900
  97. memory_size = 1024
  98. source_code_hash = filebase64sha256("${path.module}/../lambdas/download.zip")
  99. layers = [aws_lambda_layer_version.deps.arn]
  100. environment { variables = local.lambda_env }
  101. }
  102. resource "aws_lambda_function" "transcribe" {
  103. filename = "${path.module}/../lambdas/transcribe_start.zip"
  104. function_name = "${local.prefix}-transcribe"
  105. role = aws_iam_role.lambda.arn
  106. handler = "transcribe_start.handler"
  107. runtime = "python3.12"
  108. timeout = 60
  109. source_code_hash = filebase64sha256("${path.module}/../lambdas/transcribe_start.zip")
  110. environment { variables = local.lambda_env }
  111. }
  112. resource "aws_lambda_function" "check" {
  113. filename = "${path.module}/../lambdas/transcribe_check.zip"
  114. function_name = "${local.prefix}-check"
  115. role = aws_iam_role.lambda.arn
  116. handler = "transcribe_check.handler"
  117. runtime = "python3.12"
  118. timeout = 60
  119. source_code_hash = filebase64sha256("${path.module}/../lambdas/transcribe_check.zip")
  120. environment { variables = local.lambda_env }
  121. }
  122. resource "aws_lambda_function" "summarize" {
  123. filename = "${path.module}/../lambdas/summarize.zip"
  124. function_name = "${local.prefix}-summarize"
  125. role = aws_iam_role.lambda.arn
  126. handler = "summarize.handler"
  127. runtime = "python3.12"
  128. timeout = 900
  129. memory_size = 512
  130. source_code_hash = filebase64sha256("${path.module}/../lambdas/summarize.zip")
  131. layers = [aws_lambda_layer_version.deps.arn]
  132. environment { variables = local.lambda_env }
  133. }
  134. resource "aws_lambda_function" "notify" {
  135. filename = "${path.module}/../lambdas/notify.zip"
  136. function_name = "${local.prefix}-notify"
  137. role = aws_iam_role.lambda.arn
  138. handler = "notify.handler"
  139. runtime = "python3.12"
  140. timeout = 60
  141. source_code_hash = filebase64sha256("${path.module}/../lambdas/notify.zip")
  142. environment { variables = local.lambda_env }
  143. }