Можно ли использовать объект корзины S3 в качестве конечной точки HTTP API?

Мне не нужна информация о о ведре (ах), я хочу иметь возможность выполнять поиск по объекту ведра (CSV / JSON) со строкой запроса и возвращать результат. Например, отправьте запрос по адресу:

https://s3.amazonaws.com/my_bucket/my_folder/my_csv.csv/querys3?index=432

В настоящее время я пытаюсь сделать это с помощью AWS API Gateway. Я знаю, что это возможно для создания шлюза API, который использует AWS Lambda и запрос get_object_content, но я полагаю, что это был бы ненужный шаг, если можно просто использовать ведро в качестве конечной точки HTTP с возможностью поиска. Эта оценка верна? Если да, то вот моя проблема -

Я установил метод тестирования, который использует интеграцию HTTP на AWS API Gateway, и, используя этот и один параметр поиска, я получаю в ответ следующее:

Status: 200 
<?xml version = "1.0" encoding = "UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message> 
<RequestId>#requestid</RequestId><HostId>#hostid=</HostId>
</Error>

Не уверен, что я получаю сообщение об отказе в доступе, потому что я запрашиваю то, что не может быть запрошено, или просто делаю это неправильно.

Можно ли использовать объект корзины S3 в качестве конечной точки, в которую я мог бы передавать строки запроса?

Взгляните на S3 Select, который позволяет создавать запросы в стиле SQL к S3. aws.amazon.com/blogs/aws/s3-glacier-select

John Hanley 16.07.2018 21:20

@JohnHanley, так я и делаю сейчас (через Lambda). Это лучшая практика?

cam 16.07.2018 21:27

Ответ зависит от ваших целей и ваших наборов данных. Выполнение запросов из Lambda нормально при условии, что запрос завершается до максимального времени выполнения Lambda (300 секунд). Я предпочитаю использовать Athena для запроса данных S3. Если мне нужно обрабатывать большие объемы данных снова и снова, я использую Redshift.

John Hanley 16.07.2018 21:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
794
2

Ответы 2

Кажется, это возможно. Я создал запрос на интеграцию для метода «GET» типа AWS service «S3» с действующей ролью выполнения, путем и другими по умолчанию. Мне удалось получить достоверный ответ от консоли api-gateway. Все это настраивалось с консоли. Конфигурация, как описано в CLI

CLI> aws apigateway get-integration --rest-api-id xxxxxxxxx --resource-id xxxxx --http-method ANY
{                                                                         
"type": "AWS",                                                        
"httpMethod": "GET",                                                  
"uri": "arn:aws:apigateway:us-east-1:s3:path/<path>",
"credentials": "arn:aws:iam::xxxxxxxxx:role/asr-s3-ec2-role",      
"passthroughBehavior": "WHEN_NO_MATCH",                               
"timeoutInMillis": 29000,                                             
"cacheNamespace": "<resource-id>",                                           
"cacheKeyParameters": [],                                             
"integrationResponses": {                                             
    "200": {                                                          
        "statusCode": "200",                                          
        "responseTemplates": {                                        
            "application/json": null                                  
        }                                                             
    }                                                                 
}                                                                     
}

Роль выглядит как

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
         "Service": [
         "apigateway.amazonaws.com"
       ]
     },
    "Action": "sts:AssumeRole"
    }
  ]
}

Вам нужно будет прикрепить к нему необходимую политику. Надеюсь, поможет.

Вы применили эту роль к своей корзине S3 или шлюзу API? Очень признателен.

cam 16.07.2018 19:42

К интеграции с API-шлюзом. Пожалуйста, см. credentials в описании выше.

asr9 16.07.2018 20:37

PS: Это только извлекает объект (GET в моем примере). Это не привело ни к каким запросам.

asr9 16.07.2018 20:44

Я по сути спрашиваю, какой тип интеграции является наиболее простым для доступа к этой функции - docs.aws.amazon.com/AmazonS3/latest/API/…

cam 16.07.2018 20:50

Is it possible to use an S3 bucket object as an endpoint that I could pass query strings to?

Не совсем, по крайней мере, не напрямую.

AWS S3, по сути, представляет собой простое хранилище ключей / значений, где имя файла - это ключ, а содержимое - это значение (хорошо, к нему также прилагаются некоторые метаданные). Таким образом, AWS S3 может возвращать только сохраненный двоичный контент или его подмножество (байты от… до), не предоставляя никакой специальной логики (службы REST).

вы все еще можете взглянуть на AWS Athena https://aws.amazon.com/athena/, чтобы сделать данные доступными для поиска Действительно, вы можете создать лямбда-выражение или другие сервисы, считывающие данные и оценивающие запрос по прочитанному контенту, но именно это делает AWS Athena.

Другие вопросы по теме