Как получить доступ к объекту корзины S3 в функции Cloudfront lambda @ Edge?

У меня есть лямбда-функция, связанная с моим облачным распределением.

Я хочу получить доступ к некоторым объектам S3 Bucket в этой функции egde @ lambda. Я не нашел способа сделать это и не знаю, как это сделать лучше всего и с минимальной задержкой.

Я не хочу получать доступ к объектам корзины с помощью HTTP-вызовов к корзине, потому что это вызовет некоторую задержку в ответе облачного интерфейса.

Кто-нибудь знает, как я могу получить доступ к своему S3 Bucket, связанному с моим распределением облачного интерфейса в функции Edge lambda?

Огромное спасибо.


person Lucas Santos    schedule 07.01.2019    source источник
comment
Я не хочу получать доступ к объектам корзины с помощью HTTP-вызовов Вот как вы получаете доступ к объектам в корзине - S3 всегда использует только HTTP, а SDK используют HTTP, поэтому непонятно, что вы имеете в виду под этим, и поэтому непонятно, чего вы на самом деле пытаетесь достичь.   -  person Michael - sqlbot    schedule 08.01.2019
comment
Привет @ michael-sqlbot. Я знаю, что объекты корзин доступны только через HTTP-запросы, но мне просто было интересно, есть ли способ получить доступ к ресурсам корзин из того же региона облачного распространения, чтобы избежать задержек и времени доступа. Меня беспокоит время, которое потребуется лямбде для выполнения запроса и получения ответа, потому что это повлияет на каждый входящий запрос для моего веб-приложения и может повлиять на производительность. Большое спасибо за ваш ответ!   -  person Lucas Santos    schedule 08.01.2019
comment
Мне до сих пор непонятно, какую проблему вы пытаетесь решить. Что в корзине и как вы это используете в Lambda @ Edge?   -  person Michael - sqlbot    schedule 09.01.2019


Ответы (1)


Вам необходимо предоставить разрешения для роли IAM, связанной с вашей лямбдой. Из документы AWS < / а>:

Каждая лямбда-функция имеет связанную с ней роль IAM (роль исполнения). Вы указываете роль IAM при создании своей лямбда-функции. Разрешения, которые вы предоставляете этой роли, определяют, что AWS Lambda может делать, когда принимает на себя эту роль.

Чтобы читать и записывать сегмент S3 из лямбда-выражения, вам необходимо присоединить политику IAM к роли IAM, связанной с вашей лямбда-функцией. Из документов AWS:

Вы управляете доступом в AWS, создавая политики и прикрепляя их к идентификаторам IAM (пользователям, группам пользователей или ролям) или ресурсам AWS. Политика - это объект в AWS, который при связывании с удостоверением или ресурсом определяет их разрешения. AWS оценивает эти политики, когда основной объект (пользователь или роль) делает запрос. Разрешения в политиках определяют, разрешен или запрещен запрос. Большинство политик хранятся в AWS в виде документов JSON. AWS поддерживает шесть типов политик: политики на основе идентификаторов, политики на основе ресурсов, границы разрешений, SCP организаций, списки контроля доступа и политики сеансов.

Используйте эту политику IAM, чтобы предоставить доступ к роли IAM, связанной с вашей лямбда:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowS3Access",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<account>:role/service-role/LAMBDA_ROLE_NAME"
            },
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::<bucket-name>",
                "arn:aws:s3:::<bucket-name>/*"
            ]
        }
    ]
}

OBS: <account> и <bucket-name> необходимо заменить на правильные значения.

После этого должен работать следующий код:

import aws from 'aws-sdk'

export default (event, context, callback) => {
  const s3 = new aws.S3()

  s3.getObject({
    Bucket: 'name-of-bucket',
    Key: 'my-key'
  }, (err, data) => {
    if (err) {
      callback(err)
      return
    }

    const objectData = data.Body.toString('utf-8')
    console.log(objectData)
  })
}
person celicoo    schedule 08.01.2019