Sửa lỗi 'Permission Denied' của AWS EventBridge đối với Lambda

intermediate☁️ AWS2026-07-19| Môi trường AWS Cloud (EventBridge / Lambda)

Error Message

The service principal events.amazonaws.com does not have permission to invoke the resource: arn:aws:lambda:region:account-id:function:function-name
#aws-eventbridge#aws-lambda#iam-policy#devops

LỗiBạn đã tạo quy tắc EventBridge, liên kết nó với một hàm Lambda và chờ đợi trình kích hoạt. Nhưng không có gì xảy ra. Không có nhật ký nào xuất hiện trong CloudWatch và hàm vẫn ở trạng thái rảnh. Nếu bạn kiểm tra các chỉ số EventBridge hoặc thử nghiệm trình kích hoạt qua CLI, có thể bạn sẽ gặp phải lỗi này:

The service principal events.amazonaws.com does not have permission to invoke the resource: arn:aws:lambda:us-east-1:123456789012:function:my-function-name

Tại sao lỗi này xảy raBảo mật của AWS Lambda dựa trên hai loại quyền khác nhau. Hầu hết các nhà phát triển đều quen thuộc với IAM Roles, thứ xác định những gì Lambda có thể truy cập. Tuy nhiên, Resource-based Policies (Chính sách dựa trên tài nguyên) hoạt động theo chiều ngược lại. Chúng xác định các dịch vụ bên ngoài, chẳng hạn như EventBridge, được phép gọi đến hàm Lambda.

Khi bạn sử dụng AWS Console để tạo một quy tắc, AWS sẽ tự động thêm quyền này cho bạn. Nhưng nếu bạn sử dụng tự động hóa—như Terraform, CLI hoặc CloudFormation—bước này thường bị bỏ qua. Nếu không có tuyên bố "allow" (cho phép) rõ ràng, Lambda sẽ từ chối yêu cầu từ EventBridge vì lý do bảo mật.

Cách khắc phục### Cách 1: Sử dụng AWS CLI (Cách khắc phục nhanh nhất)Nếu bạn cần một giải pháp ngay lập tức, CLI là lựa chọn tốt nhất. Bạn có thể chèn thủ công tuyên bố quyền cần thiết vào chính sách của hàm. Điều này thông báo cho AWS rằng dịch vụ EventBridge là một đối tượng gọi đáng tin cậy.

Chạy lệnh này trong terminal của bạn. Hãy đảm bảo thay thế các phần giữ chỗ bằng tên hàm và Rule ARN thực tế của bạn:

aws lambda add-permission \n  --function-name MyDataProcessor \n  --statement-id EventBridgeTriggerConfig \n  --action 'lambda:InvokeFunction' \n  --principal events.amazonaws.com \n  --source-arn arn:aws:events:us-east-1:123456789012:rule/DailyCleanupRule
```- **function-name**: Tên của Lambda cụ thể.- **statement-id**: Một nhãn duy nhất cho quy tắc này (ví dụ: "AllowCronTrigger").- **principal**: Giá trị này phải là `events.amazonaws.com`.- **source-arn**: Điều này giới hạn quyền để *chỉ* quy tắc cụ thể này mới có thể kích hoạt hàm, ngăn các quy tắc khác trong tài khoản của bạn thực hiện điều đó.### Cách 2: Sử dụng AWS Management Console- Mở **AWS Lambda Console** và nhấp vào hàm của bạn.- Chọn tab **Configuration**, sau đó nhấp vào **Permissions** ở thanh bên trái.- Tìm phần **Resource-based policy statements** và nhấp vào **Add permissions**.- Chọn **AWS Service** và chọn **Other**.- Điền thông tin chi tiết:**Statement ID**: Đặt tên rõ ràng như `EventBridgeInvokePermission`.- **Principal**: Nhập `events.amazonaws.com`.- **Source ARN**: Dán ARN đầy đủ của EventBridge Rule của bạn.- **Action**: Chọn `lambda:InvokeFunction`.- Nhấp vào **Save**.### Cách 3: Cơ sở hạ tầng dưới dạng mã (Terraform)Việc sửa lỗi thủ công trên console dễ dẫn đến tình trạng "configuration drift" (sai lệch cấu hình). Nếu bạn quản lý cơ sở hạ tầng bằng Terraform, bạn phải bao gồm một khối `aws_lambda_permission`. Điều này đảm bảo quyền được duy trì qua mỗi lần triển khai.

resource "aws_lambda_permission" "allow_eventbridge" {\n statement_id = "AllowExecutionFromEventBridge"\n action = "lambda:InvokeFunction"\n function_name = aws_lambda_function.my_lambda.function_name\n principal = "events.amazonaws.com"\n source_arn = aws_cloudwatch_event_rule.my_schedule.arn\n}


## Xác minhNó đã hoạt động chưa? Bạn có thể xác minh chính sách hiện tại bằng cách chạy lệnh kiểm tra nhanh sau:

aws lambda get-policy --function-name MyDataProcessor


Tìm khối JSON có `Effect` là `Allow` và `Principal` khớp với dịch vụ EventBridge. Sau khi xác nhận, hãy đợi lần chạy theo lịch trình tiếp theo. Bạn sẽ thấy số lượng **Invocations** tăng lên trong tab Monitoring của hàm Lambda.
## Kiểm tra khắc phục sự cố cuối cùngVẫn gặp sự cố? Hãy kiểm tra ba nguyên nhân phổ biến sau:
- **Region Lock**: Quy tắc EventBridge không thể kích hoạt các hàm Lambda nằm ở một AWS Region khác. Ví dụ, cả hai phải cùng nằm ở `us-east-1`.- **Rule State**: Đảm bảo trạng thái quy tắc được chuyển sang "Enabled".- **JSON Syntax**: Nếu quy tắc của bạn truyền một payload JSON tùy chỉnh, chỉ cần thiếu một dấu phẩy sẽ khiến việc kích hoạt thất bại trong âm thầm.Khi viết các script triển khai để tự động hóa các bản sửa lỗi này, tôi thường sử dụng [Unix Permissions Calculator của ToolCraft](https://toolcraft.app/en/tools/developer/unix-permissions). Nó giúp tôi nhanh chóng thiết lập các giá trị `chmod` phù hợp cho các shell script mà không cần phải nhớ các phép tính bát phân. Đây là một công cụ đơn giản, tập trung vào quyền riêng tư giúp tiết kiệm thời gian suy nghĩ.

Related Error Notes