Мне не нужна информация о о ведре (ах), я хочу иметь возможность выполнять поиск по объекту ведра (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 в качестве конечной точки, в которую я мог бы передавать строки запроса?
@JohnHanley, так я и делаю сейчас (через Lambda). Это лучшая практика?
Ответ зависит от ваших целей и ваших наборов данных. Выполнение запросов из Lambda нормально при условии, что запрос завершается до максимального времени выполнения Lambda (300 секунд). Я предпочитаю использовать Athena для запроса данных S3. Если мне нужно обрабатывать большие объемы данных снова и снова, я использую Redshift.





Кажется, это возможно. Я создал запрос на интеграцию для метода «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? Очень признателен.
К интеграции с API-шлюзом. Пожалуйста, см. credentials в описании выше.
PS: Это только извлекает объект (GET в моем примере). Это не привело ни к каким запросам.
Я по сути спрашиваю, какой тип интеграции является наиболее простым для доступа к этой функции - docs.aws.amazon.com/AmazonS3/latest/API/…
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.
Взгляните на S3 Select, который позволяет создавать запросы в стиле SQL к S3. aws.amazon.com/blogs/aws/s3-glacier-select