我想通过我的 Amazon Elastic Container Service (Amazon ECS) 任务访问 Amazon Simple Storage Service (Amazon S3),但我遇到了连接问题。
解决方法
分析您的 CloudWatch 日志以确定 Amazon S3 访问问题的原因
首先,设置对 CloudWatch Logs 的访问权限。然后,使用 CloudWatch Logs Insights 确定问题的原因。
设置 CloudWatch Logs 访问权限
要为您的 Amazon ECS 任务定义配置 Amazon CloudWatch Logs,请完成以下步骤:
- 打开 Amazon ECS 控制台。
- 在导航窗格中,选择 Task definitions(任务定义)。
- 选择您的任务定义,然后将以下代码添加到任务定义中:
{
"containerDefinitions": [
{
"name": "my-container",
"image": "my-image:latest",
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/my-task",
"awslogs-region": "region-code",
"awslogs-stream-prefix": "ecs"
}
}
}
]
}
**注意:**将 my-container 替换为您的容器实例名称,将 my-image:latest 替换为您的映像名称和标签,将 region-code 替换为您的 AWS 区域。
- 更新您的 Amazon ECS 服务以使用最新版本的任务定义。
使用 CloudWatch Logs Insights 确定问题的原因
要搜索常规 Amazon S3 错误,请运行以下查询:
filter @message like /S3|AccessDenied|NoSuchBucket/
要搜索特定的存储桶访问问题,请运行以下查询:
filter @message like /my-bucket-name/
**注意:**将 my-bucket-name 替换为您的存储桶名称。
使用此信息来确定问题是否与 AWS Identity and Access Management (IAM) 权限、网络连接、存储桶配置或应用程序问题有关。然后,完成相关的故障排除步骤。
验证您的 IAM 角色配置
验证 Amazon ECS 任务的任务角色是否具有必要的 Amazon S3 权限,例如只读操作的 AmazonS3ReadOnlyAccess 策略。查看 AWS CloudTrail 日志,以确定与 Amazon S3 相关的被拒绝的操作。例如,如果您的 Amazon ECS 任务必须从 my-app-data 存储桶读取对象,请将以下自定义策略附加到该任务:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-app-data",
"arn:aws:s3:::my-app-data/*"
]
}
]
}
**注意:**前面的策略允许任务列出 my-app-data 存储桶的内容并从中检索对象。
检查网络配置
公有子网中的任务
对于公有子网中的任务,请检查您的实例所在的虚拟私有云 (VPC) 的网络访问控制列表(网络 ACL)。网络 ACL 必须允许端口 443 上的出站流量。此外,请验证与您的任务相关的安全组是否允许通过端口 443 向 Amazon S3 AWS 托管前缀列表发送出站 HTTPS 流量。
私有子网中的任务
对于私有子网中的任务,请验证 NAT 网关是否与子网的路由表相关联。NAT 网关创建了到达 Amazon S3 端点的互联网路径。如果您使用 Amazon S3 的 VPC 端点,请在与您的 VPC 关联的路由表中查看 Amazon S3 网关端点。验证路由表是否包含 Amazon S3 AWS 托管前缀列表的路由,该列表将流量定向到 Amazon S3 网关端点。此路由可确保向 Amazon S3 发出的请求不会通过公共互联网发送。
当您使用 Amazon S3 接口端点时,请验证连接到该端点的安全组是否允许端口 443 上的入站 HTTPS 流量。此外,请确保激活端点的私有 DNS 设置以及 VPC 的 Enable DNS hostname(启用 DNS 主机名)和 Enable DNS support(启用 DNS 支持)DNS 设置。最后,验证应用程序是否使用的是 s3.region.amazonaws.com 端点,而非 s3.amazonaws.com 全球端点。
测试从 Amazon ECS 任务到 Amazon S3 端点的网络连接
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
验证您的网络配置(包括防火墙和安全组)是否允许流向 Amazon S3 端点的流量。
**注意:**您可以使用 ECS Exec 运行以下命令。
要在端口 443 上测试与 Amazon S3 端点的 HTTPS 连接,请运行以下 telnet 或 curl 命令:
telnet s3.region-code.amazonaws.com 443
curl -v https://s3.region-code.amazonaws.com
**注意:**将 region-code 替换为您的区域。您可能需要安装 telnet 命令。
要测试容器实例是否可以进行身份验证和执行 Amazon S3 操作,请运行 ls AWS CLI 命令:
aws s3 ls
如果前面的测试失败,请查看您的安全组、网络 ACL 和防火墙规则,检查是否有被阻止的端口。
相关信息
如何对来自 Amazon S3 的 403 Access Denied(403 拒绝访问)错误进行故障排除?
如何从 Fargate 上的 Amazon ECS 任务访问其他 AWS 服务?
如何解决在我的 Amazon S3 存储桶上执行“cp”或“sync”命令时出现的连接错误?