Webhooks
Webhooks для S3 — это возможность настраивать отправку HTTP/S запросов по событиям для бакета, используя API. Например, можно:
- настроить обработку и конвертирование файлов после загрузки;
- интегрироваться с любыми внешними системами;
- настроить логирование для объектного хранилища.
Перечень событий (Event), для которых возможно настроить конфигурацию Webjook:
- s3:ObjectCreated:* — PutObject, PutObjectCopy, CompleteMultipartUpload.
- s3:ObjectCreated — PutObject.
- s3:ObjectCreated — PutObjectCopy.
- s3:ObjectCreated — CompleteMultipartUpload.
- s3:ObjectRemoved:* — DeleteObject.
- s3:ObjectRemoved — DeleteObject.
Доступны следующие методы для работы с WebHooks:
- PutBucketNotificationConfiguration;
- GetBucketNotificationConfiguration.
1PUT /?notification HTTP/1.1 2Host: Bucket.hb.vkcs.cloud 3 4<?xml version="1.0" encoding="UTF-8"?> 5<NotificationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 6 <SimpleTopicConfiguration> 7 <Id>string</Id> 8 <Url>string</Url> 9 <Event>string</Event> 10 ... 11 <Filter> 12 <S3Key> 13 <FilterRule> 14 <Name>string</Name> 15 <Value>string</Value> 16 </FilterRule> 17 ... 18 </S3Key> 19 </Filter> 20 </SimpleTopicConfiguration> 21 ... 22</NotificationConfiguration>
Метод PUT позволяет включить уведомление о некотором событии (PutObject, DeleteObject и т.д) в бакете.
На данный момент поддерживается 1 тип событий - SimpleTopicConfiguration - запрос на url, предоставленный пользователем.
Пример: Требуется, чтобы выполнялся запрос на url http://test.com при PutObject в бакет bucketA объектов, имена которых подходят под маску image/*.png.
Запрос:
1PUT /?notification HTTP/1.1 2Host: bucketA.hb.vkcs.cloud 3Content-Length: 606 4Content-Type: application/xml 5x-amz-content-sha256: 34850007f92ec3331486b48fd7db15f48315fe73c4a9b135e6d9fd629276c1e7 6x-amz-date: 20200831T000345Z 7Authorization: AWS4-HMAC-SHA256 Credential=II5JDQBAN3JYM4DNEB6C/20200831/ru-msk/s3/aws4_request,SignedHeaders=content-md5;content-type;host;x-amz-content-sha256;x-amz-date,Signature=fc07a541c2acdbf7527eba358afa0a6d460c9bfec539dd29dfa6b5b854aae109 8 9<?xml version="1.0" encoding="UTF-8"?> 10<NotificationConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 11 <SimpleTopicConfiguration> 12 <Id>1</Id> 13 <Event>s3:ObjectCreated:Put</Event> 14 <Url>http://test.com</Url> 15 <Filter> 16 <S3Key> 17 <FilterRule> 18 <Name>Prefix</Name> 19 <Value>image/</Value> 20 </FilterRule> 21 <FilterRule> 22 <Name>Suffix</Name> 23 <Value>.png</Value> 24 </FilterRule> 25 </S3Key> 26 </Filter> 27 </SimpleTopicConfiguration> 28</NotificationConfiguration>
Ответ:
HTTP/1.1 200 OK
Date: Mon, 31 Aug 2020 17:31:43 GMT
x-amz-request-id: tx00000000000000010ad2b-005a6135e2-f647d-ru-mska
Content-Length: 0
Content-Type: application/xml
Connection: close
Возвращает текущую конфигурацию правил (SimpleNotificationConfiguration) бакета. Если правила не были установлены для данного бакета, будет возращен пустой элемент NotificationConfiguration.
Запрос:
GET /?notification HTTP/1.1
Host: my-test-bucket1.hb.vkcs.cloud
Content-Length: 0
Content-Type: application/xml
x-amz-content-sha256: 34850007f92ec3331486b48fd7db15f48315fe73c4a9b135e6d9fd629276c1e7
x-amz-date: 20200831T000345Z
Authorization: AWS4-HMAC-SHA256 Credential=II5JDQBAN3JYM4DNEB6C/20200831/ru-msk/s3/aws4_request,SignedHeaders=content-md5;content-type;host;x-amz-content-sha256;x-amz-date,Signature=fc07a541c2acdbf7527eba358afa0a6d460c9bfec539dd29dfa6b5b854aae109
Ответ:
1HTTP/1.1 200 2Date: Mon, 31 Aug 2020 17:31:43 GMT 3x-amz-request-id: tx00000000000000010ad2b-005a6135e2-f647d-ru-mska 4Content-Length: 1031 5Content-Type: application/xml 6Connection: close 7 8<?xml version="1.0" encoding="UTF-8"?> 9<NotificationConfiguration> 10 <SimpleTopicConfiguration> 11 <Id>1</Id> 12 <Event>s3:ObjectCreated:Put</Event> 13 <Url>http://test321.com</Url> 14 <Filter> 15 <S3Key> 16 <FilterRule> 17 <Name>Prefix</Name> 18 <Value>image/</Value> 19 </FilterRule> 20 <FilterRule> 21 <Name>Suffix</Name> 22 <Value>.png</Value> 23 </FilterRule> 24 </S3Key> 25 </Filter> 26 </SimpleTopicConfiguration> 27 <SimpleTopicConfiguration> 28 <Id>2</Id> 29 <Event>s3:ObjectRemoved:Delete</Event> 30 <Url>http://test123.com</Url> 31 <Filter> 32 <S3Key> 33 <FilterRule> 34 <Name>Prefix</Name> 35 <Value>image/</Value> 36 </FilterRule> 37 <FilterRule> 38 <Name>Suffix</Name> 39 <Value>.png</Value> 40 </FilterRule> 41 </S3Key> 42 </Filter> 43 </SimpleTopicConfiguration> 44</NotificationConfiguration>
Для примера установленных правил, при загрузке объектов в бакет bucketA с именами image/*.png, будет приходить следующий запрос:
1POST <url> HTTP/1.1 2x-amz-sns-messages-type: SubscriptionConfirmation 3 4{ "Records": 5 [ 6 { 7 "s3": { 8 "object": { 9 "eTag":"aed563ecafb4bcc5654c597a421547b2", 10 "sequencer":1577453615, 11 "key":"some-file-to-bucket", 12 "size":100 13 }, 14 "configurationId":"1", 15 "bucket": { 16 "name": "bucketA", 17 "ownerIdentity": { 18 "principalId":"mcs2883541269"} 19 }, 20 "s3SchemaVersion":"1.0" 21 }, 22 "eventVersion":"1.0", 23 "requestParameters":{ 24 "sourceIPAddress":"185.6.245.156" 25 }, 26 "userIdentity": { 27 "principalId":"2407013e-cbc1-415f-9102-16fb9bd6946b" 28 }, 29 "eventName":"s3:ObjectCreated:Put", 30 "awsRegion":"ru-msk", 31 "eventSource":"aws:s3", 32 "responseElements": { 33 "x-amz-request-id":"VGJR5rtJ" 34 } 35 } 36 ] 37}
В момент выполнения этого запроса сервис VK Cloud s3 валидирует url, выполняя на него следующий запрос (2):
1POST http://test.com HTTP/1.1 2x-amz-sns-messages-type: SubscriptionConfirmation 3content-type: application/json 4 5{ 6 "Timestamp":"2019-12-26T19:29:12+03:00", 7 "Type":"SubscriptionConfirmation", 8 "Message":"You have chosen to subscribe to the topic $topic. To confirm the subscription you need to response with calculated signature", 9 "TopicArn":"mcs2883541269|bucketA|s3:ObjectCreated:Put", 10 "SignatureVersion":1, 11 "Token":"RPE5UuG94rGgBH6kHXN9FUPugFxj1hs2aUQc99btJp3E49tA" 12}
для подтверждения url необходимо в ответ отправить подпись:
1content-type: application/json 2 3{"signature":"ea3fce4bb15c6de4fec365d36bcebbc34ccddf54616d5ca12e1972f82b6d37af"}
Сигнатура вычисляется по формуле:
signature = hmacsha256(_url, hmacsha256(_TopicArn, hmacsha256(_Timestamp, Token)))
в нашем примере:
signature = hmac_sha256_hex(“http://test.com”, hmac_sha256(“mcs2883541269|bucketA|s3:ObjectCreated:Put”, hmac_sha256(“2019-12-26T19:29:12+03:00”, “RPE5UuG94rGgBH6kHXN9FUPugFxj1hs2aUQc99btJp3E49tA”)))
При успешном подтверждении url, в ответ на запрос (1) будет отправлен response:
HTTP/1.1 200