Как написать политику в .yaml для лямбда-Python для чтения с S3, используя AWS SAM Cli - PullRequest
1 голос
/ 09 июля 2019

Я пытаюсь развернуть Python-лямбду в aws.Эта лямбда просто читает файлы из сегментов s3, когда им присваивается имя и путь к файлу.Он работает правильно на локальном компьютере, если я запускаю следующую команду:

sam build && sam local invoke --event testfile.json GetFileFromBucketFunction

Данные из файла выводятся на консоль.Затем, если я выполню следующую команду, лямбда будет упакована и отправлена ​​в my-bucket.

sam build && sam package --s3-bucket my-bucket --template-file .aws-sam\build\template.yaml --output-template-file packaged.yaml

Следующим шагом будет развертывание в prod, поэтому я попробую следующую команду:

sam deploy --template-file packaged.yaml --stack-name getfilefrombucket --capabilities CAPABILITY_IAM --region my-region

Лямбда теперь можно увидеть в лямбда-консоли, я могу запустить ее, но содержимое не возвращается, если я вручную изменяю служебную роль на роль, которая позволяет получить / поставить s3, тогда лямбда работает.Однако это подрывает весь смысл использования aws sam cli.

Я думаю, что мне нужно добавить политику в файл template.yaml.Эта ссылка здесь , кажется, говорит о том, что я должен добавить политику, подобную показанной здесь .Итак, я добавил:

Policies: S3CrudPolicy

В разделе «Ресурсы: GetFileFromBucketFunction: Properties:» я затем перестроил приложение и повторно развернул, и развертывание завершилось неудачно со следующими ошибками в облачной информации:

1 validation error detected: Value 'S3CrudPolicy' at 'policyArn' failed to satisfy constraint: Member must have length greater than or equal to 20 (Service: AmazonIdentityManagement; Status Code: 400; Error Code: ValidationError; Request ID: unique number

и

The following resource(s) failed to create: [GetFileFromBucketFunctionRole]. . Rollback requested by user.

Я удаляю стек, чтобы начать снова.Я думал, что «S3CrudPolicy» - это не готовая политика, которую я могу просто использовать, а то, что мне нужно было бы определить в файле template.yaml?

Я не уверен, как это сделать, иДокументы, кажется, не показывают очень простых примеров использования (из того, что я вижу), если кто-нибудь знает, как это сделать, не могли бы вы опубликовать решение?

Я попробовал следующее:

S3CrudPolicy:
  PolicyDocument:
    -
      Action: "s3:GetObject"
      Effect:  Allow
      Resource: !Sub arn:aws:s3:::${cloudtrailBucket}
      Principal:  "*"

Но это не удалось из-за следующей ошибки:

Failed to create the changeset: Waiter ChangeSetCreateComplete failed: Waiter encountered a terminal failure state Status: FAILED. Reason: Invalid template property or properties [S3CrudPolicy] 

Если кто-нибудь может помочь написать простую политику для чтения / записи из s3, чем это было бы удивительно?Мне нужно написать еще один, чтобы получить лямбды, чтобы вызывать и другие лямбды, так что решение здесь (я представляю что-то подобное?) Было бы здорово?- Или приличное, простое в использовании руководство по написанию этих заявлений о политике?

Большое спасибо за вашу помощь!

1 Ответ

1 голос
/ 09 июля 2019

Нашел это !!В случае, если кто-то еще борется с этим, вам нужно добавить следующие несколько строк в Ресурсы: YourFunction: свойства в файле template.yaml:

  Policies: 
    - S3CrudPolicy:
        BucketName: "*"

"*" позволит вашей лямбде общаться с любым сегментомВы можете переключиться на что-то конкретное, если требуется.Если вы опустите 'BucketName', то он не будет работать и вернет ошибку в CloudFormation, указав, что S3CrudPolicy недопустим.

...