🦝
【AWS】SQS 403 Forbiddenエラーの解決方法
問題の概要
ECSタスクからSQSキューへのアクセス時に403 Forbiddenエラーが発生しました。
エラーログ
LogGroup: scout-admin-dev
LogStream: laravel-server
LogMessage: [2025-06-12 18:01:41] develop.ERROR: Error executing "SendMessage" on "https://sqs.ap-northeast-1.amazonaws.com"; AWS HTTP error: Client error: `POST https://sqs.ap-northeast-1.amazonaws.com` resulted in a `403 Forbidden` response
原因分析
SQSアクセスには双方向の権限設定が必要ですが、IAMロール側の権限が不足していました:
- ✅ SQSリソースポリシー: 設定済み(特定のIAMロールからのアクセスを許可)
- ❌ IAMロール権限: 未設定(ECSタスクロールにSQSアクセス権限なし)
解決手順
1. 現状確認
ECSタスクロールの既存ポリシーを確認:
aws iam list-role-policies --role-name <ECS_TASK_ROLE_NAME> --region <REGION>
結果: SQSアクセス権限なし
- CloudWatch Logs権限のみ
- S3バケットアクセス権限のみ
2. SQSアクセス権限の追加
ECSタスクロールにSQSアクセス権限を追加:
aws iam put-role-policy \
--role-name <ECS_TASK_ROLE_NAME> \
--policy-name SQSAccessPolicy \
--policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sqs:SendMessage",
"sqs:ReceiveMessage",
"sqs:DeleteMessage",
"sqs:GetQueueAttributes",
"sqs:GetQueueUrl"
],
"Resource": "arn:aws:sqs:<REGION>:<ACCOUNT_ID>:<QUEUE_NAME>"
}
]
}' \
--region <REGION>
3. 権限追加の確認
aws iam list-role-policies --role-name <ECS_TASK_ROLE_NAME> --region <REGION>
期待結果:
{
"PolicyNames": [
"DefaultPolicy",
"s3",
"SQSAccessPolicy"
]
}
4. ECSサービスの再起動
新しい権限を適用するためECSサービスを再起動:
aws ecs update-service \
--cluster <ECS_CLUSTER_NAME> \
--service <ECS_SERVICE_NAME> \
--force-new-deployment \
--region <REGION>
5. 動作確認
ログを確認してエラーが解消されたことを確認:
aws logs filter-log-events \
--log-group-name <LOG_GROUP_NAME> \
--log-stream-names <LOG_STREAM_NAME> \
--start-time $(date -d '5 minutes ago' +%s)000 \
--region <REGION> \
--query 'events[].message'
設定済み権限の詳細
SQSリソースポリシー(既に設定済み)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowECSTaskAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<ACCOUNT_ID>:role/<ECS_TASK_ROLE_NAME>"
},
"Action": [
"sqs:SendMessage",
"sqs:ReceiveMessage",
"sqs:DeleteMessage",
"sqs:GetQueueAttributes",
"sqs:GetQueueUrl"
],
"Resource": "arn:aws:sqs:<REGION>:<ACCOUNT_ID>:<QUEUE_NAME>",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "<ACCOUNT_ID>"
}
}
}
]
}
IAMロールポリシー(今回追加)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sqs:SendMessage",
"sqs:ReceiveMessage",
"sqs:DeleteMessage",
"sqs:GetQueueAttributes",
"sqs:GetQueueUrl"
],
"Resource": "arn:aws:sqs:<REGION>:<ACCOUNT_ID>:<QUEUE_NAME>"
}
]
}
重要なポイント
双方向権限の必要性
SQSアクセスには以下の両方が必要:
- SQS側(リソースポリシー): 「誰がアクセスできるか」を定義
- IAM側(ロールポリシー): 「何にアクセスできるか」を定義
セキュリティ考慮事項
- 最小権限の原則: 必要最小限のアクションのみ許可
- リソース制限: 特定のSQSキューのみ対象
- アカウント制限: 同一AWSアカウント内のみアクセス許可
結果
✅ 403 Forbiddenエラーが解消され、ECSタスクからSQSへの正常なアクセスが可能になりました。
トラブルシューティングのポイント
よくある間違い
- SQSポリシーのみ設定: IAMロール権限も必要
- IAMロール権限のみ設定: SQSリソースポリシーも必要
- 権限適用の遅延: ECSサービス再起動が必要
確認方法
-
IAMロール権限:
aws iam list-role-policies
-
SQSリソースポリシー:
aws sqs get-queue-attributes --attribute-names Policy
-
ECSタスクステータス:
aws ecs describe-services
- ログ確認: CloudWatch Logsでエラーメッセージを確認
Discussion