【问题标题】:如何从 AWS SAM 启动 lambda 函数并将自定义 AWS IAM 角色分配给 lambda
【发布时间】:2021-04-11 21:41:14
【问题描述】:

现在,我们在 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。但我们无法弄清楚如何使用在使用 AWS SAM 部署 CF 堆栈期间在运行时创建的 IAM 角色和 Layer Arn 并创建 lambda 函数。

我们将非常感谢您对此提供任何帮助或指导。

【问题讨论】:

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


    【解决方案1】:

    因此,如果您想引用 SAM 根据documentation 创建的角色和层,您需要在模板中定义它们,下面是一个工作模板:

    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
    

    【讨论】:

    • 在我们的例子中,我们希望将 SAM 保留在 AWS 存储库中,然后在部署时通过 Cloudformation 模板部署 lambda。我们在部署 CF 堆栈时创建 IAM 角色,以及我们希望与 Lambda 一起使用的这些 IAM 角色,这些 IAM 角色正在使用 AWS sam 存储库中的 SAM 进行部署。
    • 是的,您可以在部署函数时提供静态 IAM 角色 ARN。我假设我们不是在谈论在堆栈之间交叉引用角色 arn。
    • 通过参考 AWS 文档能够弄清楚如何使用 IAM 角色和 AWS SAM 将 IAM 角色分配给 AWS lambda 函数。
    • 是的,我之前发布的 CF 和 SAM sn-p 与我们在 CF 模板中使用的相同。
    【解决方案2】:

    下面是我们使用的示例 sn-p,以便使通过 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 模板中使用的 sn-p 来调用上面的 AWS SAM 模板来部署 lambda 函数:

      HelmLambda:
        Type: AWS::Serverless::Application
        Properties:
          Location:
            ApplicationId: 'ARN_TO_SAM'
            SemanticVersion: 0.0.5
          Parameters:
            EKSProvisionRoleArn: !Ref EKSProvisionRoleArn
    

    【讨论】:

      【解决方案3】:

      因此,如果您查看documentation,您可以看到您只是使用 Role 和 Layer 作为属性。无需为您进行太多重构。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-17
        • 2023-04-10
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 2015-10-17
        • 2019-12-08
        • 2016-07-04
        相关资源
        最近更新 更多