S3 запрашивает время ожидания от .Net Core App, запущенного в ECS - PullRequest
1 голос
/ 01 октября 2019

Ниже приведен мой код для получения объекта из s3. Этот код работает локально на моей машине, где у меня есть профиль aws и настроенный файл конфигурации. У меня сложилось впечатление, что если бы я дал моей задаче ecs роль, которая могла бы получить доступ к s3, это все равно работало бы без передачи моего ключа доступа и секретного ключа s3Client в моем коде.

S3 GET Code

  public async Task GetFilesFromS3Async(IEnumerable<FileDownloadViewModel> attachments)
        {
            foreach (var attachment in attachments)
            {
                var request = new GetObjectRequest()
                {
                    BucketName = "bucketname",
                    Key = $"{attachment.SubBucket}/{attachment.ObjectId}/{attachment.FileName}"
                };

                using(var s3response = await _client.GetObjectAsync(request))
                {
                    using (var memoryStream = new MemoryStream())
                    {
                        await s3response.ResponseStream.CopyToAsync(memoryStream);
                        memoryStream.Position = 0;
                        attachment.FileBytes = memoryStream.ToArray();
                    }
                }                
            }
        }

s3 клиент init

 private readonly IAmazonS3 _client;

    public S3Service(IAmazonS3 client)
    {
        _client = client;
    }

startup.cs код

services.AddAWSService<IAmazonS3>();

Роль в моей задаче иЭкземпляр ec2 имеет политики, которые разрешают операции записи / чтения в s3.

EDIT

Политика, которую я использую для моего экземпляра ec2 и сервисов, на которых выполняются мои контейнеры: (В основном всеопераций get и put для s3)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutAnalyticsConfiguration",
                "s3:GetObjectVersionTagging",
                "s3:CreateBucket",
                "s3:ReplicateObject",
                "s3:GetObjectAcl",
                "s3:GetBucketObjectLockConfiguration",
                "s3:DeleteBucketWebsite",
                "s3:PutLifecycleConfiguration",
                "s3:GetObjectVersionAcl",
                "s3:DeleteObject",
                "s3:GetBucketPolicyStatus",
                "s3:GetObjectRetention",
                "s3:GetBucketWebsite",
                "s3:PutReplicationConfiguration",
                "s3:PutObjectLegalHold",
                "s3:GetObjectLegalHold",
                "s3:GetBucketNotification",
                "s3:PutBucketCORS",
                "s3:GetReplicationConfiguration",
                "s3:ListMultipartUploadParts",
                "s3:PutObject",
                "s3:GetObject",
                "s3:PutBucketNotification",
                "s3:PutBucketLogging",
                "s3:PutBucketObjectLockConfiguration",
                "s3:GetObjectVersionForReplication",
                "s3:GetLifecycleConfiguration",
                "s3:ListBucketByTags",
                "s3:GetInventoryConfiguration",
                "s3:GetBucketTagging",
                "s3:PutAccelerateConfiguration",
                "s3:DeleteObjectVersion",
                "s3:GetBucketLogging",
                "s3:ListBucketVersions",
                "s3:RestoreObject",
                "s3:GetBucketPolicy",
                "s3:PutEncryptionConfiguration",
                "s3:GetEncryptionConfiguration",
                "s3:GetObjectVersionTorrent",
                "s3:AbortMultipartUpload",
                "s3:GetBucketRequestPayment",
                "s3:GetObjectTagging",
                "s3:GetMetricsConfiguration",
                "s3:DeleteBucket",
                "s3:PutBucketVersioning",
                "s3:GetBucketPublicAccessBlock",
                "s3:ListBucketMultipartUploads",
                "s3:PutMetricsConfiguration",
                "s3:GetBucketVersioning",
                "s3:GetBucketAcl",
                "s3:PutInventoryConfiguration",
                "s3:GetObjectTorrent",
                "s3:PutBucketWebsite",
                "s3:PutBucketRequestPayment",
                "s3:PutObjectRetention",
                "s3:GetBucketCORS",
                "s3:GetBucketLocation",
                "s3:ReplicateDelete",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::bucket/*",
                "arn:aws:s3:::bucket"
            ]
        }
    ]
}

В консоли моего внешнего интерфейса я также получаю ошибку cors, но в моем приложении больше нет проблем cors.

1 Ответ

1 голос
/ 01 октября 2019

Тайм-аут звучит так, как будто на уровне сети что-то не настроено. Я ожидал бы исключение с ошибкой разрешений, если бы это была проблема политики. Мне нужно знать, как выглядят ваша роль задачи ECS и подключенные политики, а также тип запуска и тип сети, который вы используете для задачи ECS для получения рекомендаций по устранению неполадок.

  1. Проверьте роли и политики

Используйте симулятор политики , чтобы смоделировать действия GetObject для вашей корзины S3, используя политику, которую, по вашему мнению, вы принимаете в задаче ECS. Это подтвердит, что это не политика, или предоставит более подробную информацию.

Убедитесь, что используется роль задачи ECS и что к используемой роли привязана эта политика. Расскажите, как выглядит ваша роль и прилагаемые политики, если вы все еще думаете, что это проблема политики.

Проверка сети

S3 обычно доступен через общедоступный Интернет. Поэтому, если вы не разрешаете доступ в Интернет через ECS, он обычно не работает, и я ожидаю, что время ожидания, как вы видите в своем OP. Вы должны проверить, что у VPC, в котором находится ваша задача, есть общедоступный доступ в Интернет через шлюз NAT, или у VPC есть частная конечная точка для вашей корзины S3, настроенная в частном VPC. Вам также необходимо убедиться, что группы безопасности, используемые в вашей задаче ECS, разрешают исходящий трафик HTTP / HTTPS (TCP-порт 80/443) в общедоступный Интернет.

Это скорее проблема сети, которую выМне нужно получить помощь по адресу serverfault.com, но вот несколько мест, где можно начать поиск сетевой проблемы.

https://serverfault.com/questions/578571/accessing-amazon-s3-from-a-private-vpc-subnet

https://aws.amazon.com/premiumsupport/knowledge-center/s3-private-connection-no-authentication/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...