Hey everyone, I've got a public Lambda function URL that's currently open to the world (yes, I know that's risky!), and I'm trying to figure out how to beef up security for it. This Lambda is designed to respond to webhooks from Google Cloud, but I'm unable to add any authentication or special headers since I don't control the requests. I've been reading that combining CloudFront, WAF, and Lambda@Edge might be a good strategy to enable IAM authentication and protect my Lambda from misuse. But I'm wondering if that's overkill for my situation? As a newcomer to AWS, I'm finding the multiple options available quite confusing. What do you all think is the best approach? Thanks for your help!
8 Answers
Honestly, you might not need to go for expensive options like CloudFront or WAF if you can just add an IP-based resource policy to limit access to Google Cloud IPs. Focus on the essential security measures before layering on more complexity.
I think you're overcomplicating things! Integrating Google Cloud with AWS is a well-documented pathway. You can set up an AWS role that allows your Lambda invoker to protect your function without going through excessive hoops.
If you know the IPs, setting up a load balancer with a security group that whitelists those addresses could be effective. While the other solutions are more common in the industry, this approach is cost-effective and secure.
Using CloudFront with WAF and Lambda@Edge has worked well for us. It streamlines your setup, allowing you to bypass the more complex API Gateway. For simple GET actions, Lambda@Edge isn't essential. You can inject a SHA256 header into the payload for POST methods to maintain security. Just be aware that while Lambda@Edge offers added features, it can introduce some latency, so consider that in your production environment.
It really depends on what risks you're addressing. Are you worried about unauthorized access, DDOS, or something else? A straightforward solution might be to use API Gateway with an API key for added security.
There are two key concerns here: authenticating the incoming webhooks and safeguarding your Lambda function URL to prevent attacks. The first part is critical! You should check if the webhook sends a signature or even HTTP Basic auth. If you have specific IPs sending the requests, that can help too. Without a way to confirm the payloads, you're just hoping no bad actors find your endpoint, which isn't a good strategy. While CloudFront and WAF can help with the latter, remember that API Gateway with WAF might be easier to implement than going the full CloudFront route.
If you're looking to keep costs down, consider using Cloudflare instead of WAF. It could be a simpler solution!
What system is sending out the webhook? If you can provide those details, we could help identify how to filter the payloads in your Lambda. If you've got known Google Cloud IPs, you might set up basic validation on that front. You could work with a setup involving API Gateway and a validator Lambda to secure your endpoint better.
Honestly, I would recommend against using Lambda function URLs if you can help it. They're public by default. Instead, try using Amazon API Gateway or an Application Load Balancer in front of your Lambda. You can add CloudFront or Cloudflare optionally to enhance security, but going through API Gateway will give you much finer control over your access settings.
Not sure I get the 'public by design' part, but I think you can still set up AWS_IAM Auth on a function URL. Clients would need to authenticate their requests with valid IAM credentials then.

Absolutely! To keep it straightforward, put a CloudFront and WAF in front of your URL, allowlist Google IPs, and use a secret header that gets validated in your Lambda. That way, you’re not over-engineering unless you absolutely need IAM signing.