【问题标题】:Is there any way I can add triggers to a lambda function in Terraform?有什么方法可以将触发器添加到 Terraform 中的 lambda 函数?
【发布时间】:2021-07-11 10:52:35
【问题描述】:
【问题讨论】:
标签:
amazon-web-services
aws-lambda
terraform
【解决方案1】:
我知道我们可以添加事件源映射,但这不是我想要的
SQS、DynamoDB 和 Kinesis 的事件源映射正是您所期待的。您在屏幕截图中显示的只是 3 项服务的事件源映射的 AWS 控制台表示。
【解决方案2】:
您可以直接在您的 terraform 代码中配置对来自大量资源的事件的订阅,并与 AWS 中的多个通知器集成。这是基于来自 SNS 的订阅事件向 lambda 添加触发器的示例。
data "aws_autoscaling_groups" "groups_servers" {
depends_on = [
aws_autoscaling_group.servers_cluster_asg_masters,
aws_autoscaling_group.servers_cluster_asg_slaves
]
filter {
name = "auto-scaling-group"
values = "servers-masters-nodes"
}
filter {
name = "auto-scaling-group"
values = "servers-slave-nodes"
}
}
resource "aws_sns_topic" "sns_servers" {
name = "sns_servers"
}
resource "aws_autoscaling_notification" "new_instances_notifications_servers" {
group_names = data.aws_autoscaling_groups.groups_servers.names
notifications = [
"autoscaling:EC2_INSTANCE_LAUNCH"
]
topic_arn = aws_sns_topic.sns_servers.arn
}
resource "aws_sns_topic_subscription" "sns_servers_servers_subscription" {
depends_on = [
aws_lambda_function.servers-cluster-orchestator
]
topic_arn = aws_sns_topic.sns_servers.arn
protocol = "lambda"
endpoint = aws_lambda_function.servers-cluster-orchestator.arn
}
resource "aws_lambda_permission" "sns_permission_servers" {
depends_on = [
aws_lambda_function.servers-cluster-orchestator,
]
statement_id = "AllowExecutionFromSNS"
action = "lambda:InvokeFunction"
function_name = aws_lambda_function.servers-cluster-orchestator.function_name
principal = "sns.amazonaws.com"
source_arn = var.sns_servers_topic
}
resource "aws_lambda_function" "servers-cluster-orchestator" {
s3_bucket = "my-bucket"
s3_key = "my-lambda.zip"
function_name = "my-lambda"
role = aws_iam_role.iam_for_lambda_servers_cluster.arn
handler = "lambda_function.lambda_handler"
runtime = "python3.7"
timeout = "60"
}