amazon-web-services - 如何从 AWS SAM 启动 lambda 函数并将自定义 AWS IAM 角色分配给 lambda

标签 amazon-web-services aws-lambda aws-cloudformation aws-sam aws-lambda-layers

现在,在我们的 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/

相关文章:

aws-lambda - Lex 对 Lambda 的调用被终止

amazon-web-services - 如何引用CloudFormation中现有的SecurityGroup?

aws-lambda - 如何构建 serverless.yml 文件以使用 serverless-express 部署 http api + lambda 项目?

python - Boto ec2创建磁盘需要很长时间才能创建 - Python

python-3.x - 如果您使用 AttributesToGet 参数在 DynamoDB 上运行扫描,您是否需要为每个项目的数据占用量付费,还是只为请求的属性付费?

python - 如何在python中导入父文件?

amazon-web-services - 使用 AWS SNS 和 Lambda - 事件源的正确用例是什么

amazon-web-services - Fn::Sub 表达式无法解析为字符串

amazon-web-services - 回调后 AWS Lambda 继续执行

python - 博托EC2 : Create an instance with tags