hasher-matcher-actioner/terraform/counters/main.tf (97 lines of code) (raw):

# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved locals { common_tags = { "HMAPrefix" = var.prefix } } resource "aws_cloudwatch_log_group" "stream_counter" { name = "/aws/lambda/${aws_lambda_function.ddb_stream_counter.function_name}" retention_in_days = var.log_retention_in_days tags = merge( var.additional_tags, { Name = "StreamCounterLambdaLogGroup" } ) } data "aws_iam_policy_document" "lambda_assume_role" { statement { effect = "Allow" actions = ["sts:AssumeRole"] principals { type = "Service" identifiers = ["lambda.amazonaws.com"] } } } resource "aws_iam_role" "ddb_stream_counter_lambda_role" { name_prefix = "${var.prefix}_ddb_stream_counter" assume_role_policy = data.aws_iam_policy_document.lambda_assume_role.json tags = merge( var.additional_tags, { Name = "StreamCounterLambdaRole" } ) } resource "aws_lambda_function" "ddb_stream_counter" { function_name = "${var.prefix}_ddb_stream_counter_${var.source_table_type}" package_type = "Image" role = aws_iam_role.ddb_stream_counter_lambda_role.arn image_uri = var.lambda_docker_info.uri image_config { command = [var.lambda_docker_info.commands.ddb_stream_counter] } timeout = 300 memory_size = 128 environment { variables = { SOURCE_TABLE_TYPE = var.source_table_type MEASURE_PERFORMANCE = var.measure_performance ? "True" : "False" COUNTS_TABLE_NAME = var.counts_datastore.name } } tags = merge( var.additional_tags, { Name = "DDBStreamCounter" } ) } data "aws_iam_policy_document" "stream_counter_iam_policy_document" { statement { effect = "Allow" actions = ["dynamodb:GetRecords", "dynamodb:GetShardIterator", "dynamodb:DescribeStream", "dynamodb:ListShards", "dynamodb:ListStreams"] resources = [var.source_stream_arn] } statement { effect = "Allow" actions = ["dynamodb:GetItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:PutItem", "dynamodb:UpdateItem"] resources = [var.counts_datastore.arn] } statement { effect = "Allow" actions = [ "logs:CreateLogStream", "logs:PutLogEvents", "logs:DescribeLogStreams" ] resources = ["${aws_cloudwatch_log_group.stream_counter.arn}:*"] } } resource "aws_iam_policy" "stream_counter_iam_policy" { name_prefix = "${var.prefix}_match_counter_iam_policy" description = "Permissions for Stream Counter Lambda" policy = data.aws_iam_policy_document.stream_counter_iam_policy_document.json } resource "aws_iam_role_policy_attachment" "stream_counter" { role = aws_iam_role.ddb_stream_counter_lambda_role.name policy_arn = aws_iam_policy.stream_counter_iam_policy.arn } resource "aws_lambda_event_source_mapping" "ddb_stream_mappings" { event_source_arn = var.source_stream_arn starting_position = "LATEST" function_name = aws_lambda_function.ddb_stream_counter.arn batch_size = 200 maximum_batching_window_in_seconds = 30 maximum_retry_attempts = 5 }