エラーの内容EventBridge ルールを作成し、Lambda 関数にリンクして、トリガーを待機しているとします。しかし、何も起こりません。CloudWatch にログは表示されず、関数はアイドルのままです。EventBridge のメトリクスを調査したり、CLI 経由でトリガーをテストしたりすると、おそらく次の壁にぶつかるでしょう:
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
原因AWS Lambda のセキュリティは、2 つの異なるタイプの権限に依存しています。ほとんどの開発者は、Lambda が何にアクセスできるかを定義する IAM ロール には慣れています。しかし、リソースベースのポリシー はその逆で、EventBridge のような外部サービスが Lambda を呼び出すことを許可するかどうかを定義します。
AWS コンソールを使用してルールを作成すると、AWS がバックグラウンドでこの権限を自動的に追加してくれます。しかし、Terraform、CLI、CloudFormation などの自動化ツールを使用する場合、このステップは省略されがちです。明示的な「許可(allow)」ステートメントがないと、Lambda はセキュリティ上の理由から EventBridge からのリクエストを拒否します。
解決方法### 方法 1: AWS CLI を使用する(最も迅速な解決策)今すぐ解決策が必要な場合は、CLI が最適です。関数のポリシーに必要な権限ステートメントを手動で挿入できます。これにより、EventBridge サービスが信頼できる呼び出し元であることを AWS に伝えます。
ターミナルで次のコマンドを実行してください。プレースホルダーを実際の関数名とルール ARN に置き換えるのを忘れないでください:
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**: 指定する Lambda の名前。- **statement-id**: このルールのユニークなラベル(例: "AllowCronTrigger")。- **principal**: これは `events.amazonaws.com` である必要があります。- **source-arn**: これにより権限が制限され、*この特定のルールのみ*が関数をトリガーできるようになり、アカウント内の他のルールが実行されるのを防ぎます。### 方法 2: AWS マネジメントコンソールを使用する- **AWS Lambda コンソール**を開き、対象の関数をクリックします。- **設定**タブを選択し、左サイドバーの**権限**をクリックします。- **リソースベースのポリシー ステートメント**セクションを見つけ、**権限を追加**をクリックします。- **AWS サービス**を選択し、**その他**を選択します。- 詳細を入力します:**ステートメント ID**: `EventBridgeInvokePermission` のような分かりやすい名前を付けます。- **プリンシパル**: `events.amazonaws.com` と入力します。- **ソース ARN**: EventBridge ルールの完全な ARN を貼り付けます。- **アクション**: `lambda:InvokeFunction` を選択します。- **保存**をクリックします。### 方法 3: Infrastructure as Code (Terraform)コンソールで修正をハードコーディングすることは、「設定のドリフト(乖離)」の原因になります。Terraform でインフラを管理している場合は、`aws_lambda_permission` ブロックを含める必要があります。これにより、デプロイのたびに権限が確実に維持されます。
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}
## 確認うまくいきましたか?次の確認コマンドを実行して、現在のポリシーを検証できます:
aws lambda get-policy --function-name MyDataProcessor
`Effect` が `Allow` で、`Principal` が EventBridge サービスと一致する JSON ブロックを探してください。確認できたら、次回のスケジュール実行を待ちます。Lambda 関数の「モニタリング」タブで **呼び出し回数(Invocations)** が増加するはずです。
## 最終的なトラブルシューティングのチェックまだ問題が解決しませんか?以下の 3 つのよくある原因を確認してください:
- **リージョンの制限**: EventBridge ルールは、異なる AWS リージョンにある Lambda 関数をトリガーすることはできません。例えば、両方が `us-east-1` に存在する必要があります。- **ルールの状態**: ルールのステータスが「有効(Enabled)」になっていることを確認してください。- **JSON 構文**: ルールがカスタム JSON ペイロードを渡す場合、カンマが 1 つ欠けているだけで、呼び出しは暗黙的に失敗します。これらの修正を自動化するためのデプロイスクリプトを書くとき、私はよく [ToolCraft の Unix パーミッション計算機](https://toolcraft.app/en/tools/developer/unix-permissions) を使用します。これは、8 進数の計算を暗記することなく、シェルスクリプトに適切な `chmod` 値を素早く設定するのに役立ちます。数分間の悩みを解消してくれる、シンプルでプライバシーを重視したツールです。

