现在在我们的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角色和层ARN。IAM角色和层ARN此在运行时创建。
现在我们想把我们的产品放在AWS-Marketplace上,我们知道AWS-Marketplace指南不支持像上面这样创建lambda函数。
我们正在考虑将lambda函数转换为AWS SAM。但我们无法弄清楚如何使用IAM角色和层Arn,它们是在使用AWS SAM的CF堆栈部署期间在运行时创建的,并无法创建lambda函数。
任何关于这方面的帮助或指导都将受到高度赞赏。
发布于 2021-01-06 17:39:16
因此,如果您想根据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下面是我的dir结构:
.
├── README.md
├── hello_world
│ ├── app.py
│ └── requirements.txt
├── lambda-layer
│ └── python
│ └── lib
│ └── python3.8
│ └── site-packages
│ └── hello.py
├── samconfig.toml
└── template.yaml发布于 2021-01-06 17:33:06
因此,如果您查看documentation,您可以看到您只是使用角色和层作为属性。没有太多的重构可以为您做。
发布于 2021-01-07 01:20:28
以下是我们使用的示例代码片段,用于使通过AWS SAM模板创建的AWS LAMBDA函数使用在CF堆栈部署时创建的自定义IAM角色。
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
sam-with-layers
Sample SAM Template for sam-with-layers
Parameters:
EKSProvisionRoleArn:
Type: String
Resources:
HelmLambda:
Type: AWS::Serverless::Function
Properties:
CodeUri: 's3://BUCKET/functions/packages/Helm/lambda.zip'
Handler: lambda_function.lambda_handler
Runtime: python3.7
MemorySize: 512
Timeout: 900
Role: !Ref EKSProvisionRoleArn
Layers:
- !Ref HelmLambdaLayer
- !Ref KubectlLambdaLayer
- !Ref CrHelperLambdaLayer
HelmLambdaLayer:
Type: AWS::Serverless::LayerVersion
Properties:
LayerName: HelmLambdaLayer
ContentUri: 's3://BUCKET/functions/packages/helmLayer/lambda.zip'
CompatibleRuntimes:
- python3.7
- python3.6
RetentionPolicy: Retain
KubectlLambdaLayer:
Type: AWS::Serverless::LayerVersion
Properties:
LayerName: KubectlLambdaLayer
ContentUri: 's3://BUCKET/functions/packages/kubectlLayer/lambda.zip'
CompatibleRuntimes:
- python3.7
- python3.6
RetentionPolicy: Retain
CrHelperLambdaLayer:
Type: AWS::Serverless::LayerVersion
Properties:
LayerName: CrHelperLambdaLayer
ContentUri: 's3://BUCKET/functions/packages/crhelperLayer/lambda.zip'
CompatibleRuntimes:
- python3.7
- python3.6
RetentionPolicy: Retain
Outputs:
HelmLambdaArn:
Description: Helm Lambda Function ARN
Value: !GetAtt HelmLambda.Arn下面是我们在CF模板中使用的代码片段,用于调用AWS SAM模板以部署lambda函数:
HelmLambda:
Type: AWS::Serverless::Application
Properties:
Location:
ApplicationId: 'ARN_TO_SAM'
SemanticVersion: 0.0.5
Parameters:
EKSProvisionRoleArn: !Ref EKSProvisionRoleArnhttps://stackoverflow.com/questions/65590758
复制相似问题