Развертывание функций AWS SAM с использованием уже созданных ролей

При попытке развернуть в aws с помощью aws sam cli мои лямбда-функции используют следующий скрипт:

aws cloudformation deploy --template-file /Users/ndelvalle/Projects/foo/functions/packaged-template.yaml --stack-name foo --region sa-east-1 --capabilities CAPABILITY_IAM --no-fail-on-empty-changeset

Я получил следующую ошибку в стеке событий:

API: iam:CreateRole User: arn:aws:iam::user/nico is not authorized to perform: iam:CreateRole on resource

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

2 ответа

Решение

Для этого вам нужно больше информации. Многие различные разрешения вступают в игру при развертывании с SAM. Я внедрил шаблон SAM для своей компании, чтобы управлять нашими лямбда-стеками. Нам нужно было предоставить нашим Java-разработчикам, работающим со стеками, те же разрешения, которые неявно и явно создает шаблон SAM, помимо простого создания ролей. Для этого мы создали несколько специальных групп в IAM, к которым мы также присоединили наших разработчиков без серверов. Можно назначить определенные предопределенные роли для Lambdas, https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction. Если вы определяете роль в шаблоне, он не создает роль автоматически. Однако, если вы объявляете другие ресурсы, такие как Api Gateway и DynamoDB, у вас все равно будут проблемы.

Короче говоря, если вы работаете с SAM, то лучше, если у вас есть администратор Sys, который дает вам разрешения на создание роли, и вам также потребуются другие разрешения, или же развертывание шаблона SAM должно быть выполнено исполнителем работ, таким как Дженкинс (что имеет разрешения). Если это слишком благоприятно для вашей команды / компании, возможно, SAM не является хорошим решением... Лучше всего переключиться на что-то вроде чистого CloudFormation и отказаться от рабочего процесса, ориентированного на разработчика. Есть о чем подумать, надеюсь, это полезно.

Вы можете использовать свойство Role , как указано в документации для AWS::Serverless::Function.

Пример шаблона, который создает новую лямбду без создания новой роли,

      Transform: AWS::Serverless-2016-10-31
Description: >
  sam-app

  Sample SAM Template for sam-app
  
# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 3
    Tracing: Active
  Api:
    TracingEnabled: True

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
    Properties:
      CodeUri: hello-world/
      Handler: app.lambdaHandler
      Runtime: nodejs18.x
      Role: <ARN of ROLE>
      Architectures:
        - x86_64
      Events:
        HelloWorld:
          Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
          Properties:
            Path: /hello
            Method: get
    Metadata: # Manage esbuild properties
      BuildMethod: esbuild
      BuildProperties:
        Minify: true
        Target: "es2020"
        Sourcemap: true
        EntryPoints: 
        - app.ts

Outputs:
  # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function
  # Find out more about other implicit resources you can reference within SAM
  # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api
  HelloWorldApi:
    Description: "API Gateway endpoint URL for Prod stage for Hello World function"
    Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
  HelloWorldFunction:
    Description: "Hello World Lambda Function ARN"
    Value: !GetAtt HelloWorldFunction.Arn
  HelloWorldFunctionIamRole:
    Description: "Implicit IAM Role created for Hello World function"
    Value: !GetAtt HelloWorldFunctionRole.Arn
Другие вопросы по тегам