现在,在我们的 CloudFormation 模板中,我们正在创建一些 lambda 函数,然后使用多个 Cloudformation 模板来执行自动化任务,以便单击部署我们的产品堆栈。以下是 CF lambda 资源的示例 CF 模板。
HelmLambda:
DependsOn: [ LambdaSGCleanup ]
Type: AWS::Lambda::Function
Properties:
Handler: lambda_function.lambda_handler
MemorySize: 512
Role: !Ref EKSProvisionRoleArn
Runtime: python3.7
Timeout: 900
Layers: [!Ref KubectlLayer, !Ref HelmLayer, !Ref CrhelperLayer]
Code:
S3Bucket: !Ref 'BucketName'
S3Key: !Sub '${KeyPrefix}functions/packages/Helm/lambda.zip'
HelmLayer:
Type: AWS::Lambda::LayerVersion
Properties:
Content:
S3Bucket: !Ref 'BucketName'
S3Key: !Sub '${KeyPrefix}functions/packages/helmLayer/lambda.zip'
在上面的 lambda 函数中,我们有两个依赖项。一是 IAM 角色和 Layer ARN。 IAM 角色和层 ARN 在运行时创建。
现在我们想将我们的产品放在 AWS-Marketplace 上,并且我们发现 AWS-Marketplace 指南不支持创建上述 lambda 函数。
我们正在考虑将 lambda 函数转换为 AWS SAM。但我们无法弄清楚如何使用在使用 AWS SAM 部署 CF 堆栈期间在运行时创建的 IAM 角色和 Layer Arn 并创建 lambda 函数。
对此的任何帮助或指导将不胜感激。
最佳答案
因此,如果您想按照 documentation 引用 SAM 创建的角色和图层您需要在模板中定义它们,下面是一个工作模板:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
sam-with-layers
Sample SAM Template for sam-with-layers
Resources:
LambdaRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub ${AWS::StackName}-lambda-role
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action: 'sts:AssumeRole'
Principal:
Service: lambda.amazonaws.com
Policies:
- PolicyName: WriteCloudWatchLogs
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- 'logs:CreateLogGroup'
- 'logs:CreateLogStream'
- 'logs:PutLogEvents'
Resource: 'arn:aws:logs:*:*:*'
HelloWorldFunction:
Type: AWS::Serverless::Functionn
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.8
Role: !GetAtt LambdaRole.Arn
Layers:
- !Ref MyLambdaLayer
MyLambdaLayer:
Type: AWS::Serverless::LayerVersion
Properties:
LayerName: MyLambdaLayer
ContentUri: lambda-layer/
CompatibleRuntimes:
- python3.8
RetentionPolicy: Retain
下面是我的目录结构:
.
├── README.md
├── hello_world
│ ├── app.py
│ └── requirements.txt
├── lambda-layer
│ └── python
│ └── lib
│ └── python3.8
│ └── site-packages
│ └── hello.py
├── samconfig.toml
└── template.yaml
关于amazon-web-services - 如何从 AWS SAM 启动 lambda 函数并将自定义 AWS IAM 角色分配给 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65590758/