Развертывание функций 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