webhook.tf 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. # tfsec:ignore:aws-lambda-enable-tracing We do not enable X-Ray Tracing for Lambda
  2. resource "aws_lambda_function" "webhook" {
  3. # checkov:skip=CKV_AWS_50: see tfsec ignore X-Ray Tracing
  4. s3_bucket = var.lambda_s3_bucket != null ? var.lambda_s3_bucket : null
  5. s3_key = var.webhook_lambda_s3_key != null ? var.webhook_lambda_s3_key : null
  6. s3_object_version = var.webhook_lambda_s3_object_version != null ? var.webhook_lambda_s3_object_version : null
  7. filename = var.lambda_s3_bucket == null ? local.lambda_zip : null
  8. source_code_hash = var.lambda_s3_bucket == null ? filebase64sha256(local.lambda_zip) : null
  9. function_name = "${var.prefix}-webhook"
  10. role = aws_iam_role.webhook_lambda.arn
  11. handler = "index.githubWebhook"
  12. runtime = var.lambda_runtime
  13. timeout = var.lambda_timeout
  14. #architectures = [var.lambda_architecture]
  15. architectures = var.lambda_architecture == "x86_64" ? [] : [var.lambda_architecture]
  16. environment {
  17. variables = {
  18. ENABLE_WORKFLOW_JOB_LABELS_CHECK = var.enable_workflow_job_labels_check
  19. WORKFLOW_JOB_LABELS_CHECK_ALL = var.workflow_job_labels_check_all
  20. ENVIRONMENT = var.prefix
  21. LOG_LEVEL = var.log_level
  22. LOG_TYPE = var.log_type
  23. REPOSITORY_WHITE_LIST = jsonencode(var.repository_white_list)
  24. RUNNER_LABELS = jsonencode(split(",", var.runner_labels))
  25. SQS_URL_WEBHOOK = var.sqs_build_queue.id
  26. SQS_IS_FIFO = var.sqs_build_queue_fifo
  27. }
  28. }
  29. tags = var.tags
  30. }
  31. resource "aws_cloudwatch_log_group" "webhook" {
  32. name = "/aws/lambda/${aws_lambda_function.webhook.function_name}"
  33. retention_in_days = var.logging_retention_in_days
  34. kms_key_id = var.logging_kms_key_id
  35. tags = var.tags
  36. }
  37. resource "aws_lambda_permission" "webhook" {
  38. statement_id = "AllowExecutionFromAPIGateway"
  39. action = "lambda:InvokeFunction"
  40. function_name = aws_lambda_function.webhook.function_name
  41. principal = "apigateway.amazonaws.com"
  42. source_arn = "${aws_apigatewayv2_api.webhook.execution_arn}/*/*/${local.webhook_endpoint}"
  43. }
  44. data "aws_iam_policy_document" "lambda_assume_role_policy" {
  45. statement {
  46. actions = ["sts:AssumeRole"]
  47. principals {
  48. type = "Service"
  49. identifiers = ["lambda.amazonaws.com"]
  50. }
  51. }
  52. }
  53. resource "aws_iam_role" "webhook_lambda" {
  54. name = "${var.prefix}-action-webhook-lambda-role"
  55. assume_role_policy = data.aws_iam_policy_document.lambda_assume_role_policy.json
  56. path = local.role_path
  57. permissions_boundary = var.role_permissions_boundary
  58. tags = var.tags
  59. }
  60. resource "aws_iam_role_policy" "webhook_logging" {
  61. name = "${var.prefix}-lambda-logging-policy"
  62. role = aws_iam_role.webhook_lambda.name
  63. policy = templatefile("${path.module}/policies/lambda-cloudwatch.json", {
  64. log_group_arn = aws_cloudwatch_log_group.webhook.arn
  65. })
  66. }
  67. resource "aws_iam_role_policy" "webhook_sqs" {
  68. name = "${var.prefix}-lambda-webhook-publish-sqs-policy"
  69. role = aws_iam_role.webhook_lambda.name
  70. policy = templatefile("${path.module}/policies/lambda-publish-sqs-policy.json", {
  71. sqs_resource_arn = var.sqs_build_queue.arn
  72. })
  73. }
  74. resource "aws_iam_role_policy" "webhook_ssm" {
  75. name = "${var.prefix}-lambda-webhook-publish-ssm-policy"
  76. role = aws_iam_role.webhook_lambda.name
  77. policy = templatefile("${path.module}/policies/lambda-ssm.json", {
  78. github_app_webhook_secret_arn = var.github_app_webhook_secret_arn,
  79. kms_key_arn = var.kms_key_arn != null ? var.kms_key_arn : ""
  80. })
  81. }