我们已将 SendGrid 集成到我们的项目中以发送电子邮件,并且出于记录目的,我们在 SendGrid 的 Webhook 中配置了应用程序端点之一以接收与我们发送的电子邮件相关的事件。
但是,我们的应用程序部署在 Azure Kubernetes 上,并且可以通过应用程序网关公开访问。网关有一个防火墙,可以识别来自 Webhook 的 API 请求,并显示一条错误消息:“请求缺少接受标头”。由于我不想完全禁用防火墙规则(因为它有助于识别缺少标头的其他请求),有没有办法向 Webhook 请求添加自定义标头?
由于您无法直接修改 SendGrid 的 webhook 发送的标头,解决方法是设置一个代理端点,在将请求转发到实际端点之前添加必要的
Accept
标头。正如您所说,您在 k8s 上运行它,您可以创建一个 Nginx 代理配置文件来添加“Accept”标头并将请求转发到您的主应用程序端点。
events {}
http {
server {
listen 8080;
location / {
# Add the Accept header
proxy_set_header Accept "application/json";
# Forward to the main application endpoint
proxy_pass http://main-app-service.default.svc.cluster.local:80;
}
}
}
如您所见,此配置将添加 Accept: application/json 标头并将请求转发到 main-app-service,这是默认或您提供的任何命名空间中主应用程序的 Kubernetes 服务的名称。也将其替换为您的实际服务名称。
将其放入 Dockerfile 中
# Use an Nginx base image
FROM nginx:alpine
# Copy the Nginx configuration
COPY nginx.conf /etc/nginx/nginx.conf
# Expose port 8080
EXPOSE 8080
# Run Nginx
CMD ["nginx", "-g", "daemon off;"]
构建并推送
docker build -t arkoacr.azurecr.io/webhook-proxy:latest .
az acr login --name arkoacr
docker push arkoacr.azurecr.io/webhook-proxy:latest
以及您的 webhook-proxy-deployment 和服务文件中的参考
apiVersion: apps/v1
kind: Deployment
metadata:
name: webhook-proxy
namespace: webhook-proxy
spec:
replicas: 1
selector:
matchLabels:
app: webhook-proxy
template:
metadata:
labels:
app: webhook-proxy
spec:
containers:
- name: nginx
image: arkoacr.azurecr.io/webhook-proxy:latest
ports:
- containerPort: 8080
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
---
apiVersion: v1
kind: Service
metadata:
name: webhook-proxy
namespace: webhook-proxy
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 8080
selector:
app: webhook-proxy
此 IP 将是您的新 SendGrid Webhook 端点。
kubectl get svc -n webhook-proxy
登录您的 SendGrid 帐户并导航至 Webhook 设置。将 Webhook 端点更新为上一步中获取的外部 IP。完毕。这应该添加
Accept
标头并将请求转发到您的主应用程序端点。