без сервера - Как добавить несколько файлов в iamRoleStatements? - PullRequest
1 голос
/ 11 марта 2020

В моем файле serverless.yml я хочу добавить iamRoleStatements из двух разных файлов (это не может измениться). Поэтому я попытался сделать это следующим образом:

provider:
  iamRoleStatements: 
    - ${file(__environments.yml):dev.iamRoleStatements, ''}
    - ${file(custom.yml):provider.iamRoleStatements, ''}

Каждый из этих файлов имеет раздел iamRoleStatements.

__ Environment.yml:

dev:
  iamRoleStatements:
    - Effect: 'Allow'
      Action: 'execute-api:Invoke'
      Resource: '*'

custom.yml:

provider:
  iamRoleStatements:
    - Effect: "Allow"
      Action:
        - lambda:InvokeFunction
      Resource:
        - "*"

По отдельности, каждый из них прекрасно работает. Но когда я пытаюсь запустить sls deploy с обоими из них, я сталкиваюсь со следующей ошибкой:

iamRoleStatements должен быть массивом объектов, где каждый объект имеет Effect, Action / NotAction, Resource / NotResource поля. В частности, в операторе 0 отсутствуют следующие свойства: Effect, Action / NotAction, Resource / NotResource; В операторе 1 отсутствуют следующие свойства: «Эффект», «Действие / NotAction», «Ресурс / NotResource»

Я выполнил поиск в Интернете, и это работает для других разделов файла без сервера, таких как resources:

# This works perfectly well.
resources: 
  - ${file(custom.yml):resources, ''}
  - ${file(__environments.yml):resources, ''}

Поэтому мне интересно, есть ли какое-либо решение для этого или оно не поддерживается в настоящее время Serverless Framework.

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 12 марта 2020

Вам придется прыгнуть через несколько обручей, чтобы попасть туда.

Ограничения слияния файлов

Безсерверная структура позволяет импортировать файлы в любом месте конфигурации, но только объединяет resources и functions разделов.

Ваш пример:

provider:
  iamRoleStatements: 
    - ${file(__environments.yml):dev.iamRoleStatements, ''}
    - ${file(custom.yml):provider.iamRoleStatements, ''}

В результате получается массив таких массивов:

{
  "provider": {
    "iamRoleStatements": [
      [
        {
          "Effect": "Allow",
          "Action": "execute-api:Invoke",
          "Resource": "*"
        }
      ],
      [
        {
          "Effect": "Allow",
          "Action": [
            "lambda:InvokeFunction"
          ],
          "Resource": [
            "*"
          ]
        }
      ]
    ]
  }
}

Вы можете иметь возможность отправить очень небольшой запрос на удаление, чтобы исправить это.

Управляемые политики IAM с использованием ссылок

Возможно, можно определить каждую из ваших ролей IAM в качестве пользовательских ресурсов и использовать iamManagedPolicies config провайдера для указания на каждый из этих ресурсов. Примерно так:

provider:
    name: aws
    iamManagedPolicies:
        - Ref: DevIamRole
        - Ref: CustomIamRole

resources:
    - ${file(__environments.yml):resources, ''}
    - ${file(custom.yml):resources, ''}

Конечно, вам нужно изменить структуру этих двух файлов, чтобы они были AWS::IAM::Role ресурсами.

Пользовательская роль IAM

Каркас также дает вам возможность получить полный контроль, что полностью задокументировано .

Надеюсь, это поможет.

...