gpt4 book ai didi

amazon-web-services - 云形成: separate cloudformation template of S3 bucket and Lambda

转载 作者:行者123 更新时间:2023-12-03 07:42:48 27 4
gpt4 key购买 nike

我创建了一个 cloudformation 模板来配置 S3 存储桶,其中包含将调用 lambda 函数的事件通知。每当存储桶中创建新对象时,都会触发lambda。我遇到的问题是,当我删除堆栈时,存储桶也会被删除。为了调试和测试目的,我必须删除堆栈。

AWSTemplateFormatVersion: '2010-09-09'
Description: Upload an object to an S3 bucket, triggering a Lambda event, returning the object key as a Stack Output.
Parameters:
Body:
Description: Stack to create s3 bucket and the lambda trigger
Type: String
Default: Test
BucketName:
Description: S3 Bucket name
Type: String
Default: image-process-bucket

Resources:
ImageProcessorExecutionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action: 'sts:AssumeRole'
Path: /
ManagedPolicyArns:
- "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
Policies:
- PolicyName: S3Policy
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- 's3:PutObject'
- 'S3:DeleteObject'
Resource: !Sub "arn:aws:s3:::${BucketName}/*"

ImageProcessor:
Type: AWS::Lambda::Function
Properties:
Description: Prints the filename
Handler: imageProcessor.handler
Role: !GetAtt ImageProcessorExecutionRole.Arn
Code: .
Runtime: nodejs12.x
Environment:
Variables:
BucketName:
Ref: BucketName

Bucket:
Type: AWS::S3::Bucket
DependsOn: BucketPermission
Properties:
BucketName: !Ref BucketName
NotificationConfiguration:
LambdaConfigurations:
- Event: 's3:ObjectCreated:*'
Function: !GetAtt ImageProcessor.Arn

BucketPermission:
Type: AWS::Lambda::Permission
Properties:
Action: 'lambda:InvokeFunction'
FunctionName: !Ref ImageProcessor
Principal: s3.amazonaws.com
SourceAccount: !Ref "AWS::AccountId"
SourceArn: !Sub "arn:aws:s3:::${BucketName}"

为了解决此问题,我使用输出将两个资源分离到单独的模板上。问题是我无法删除 Lambda 函数堆栈,因为它正在被存储桶堆栈引用。

  1. 我想知道什么是正确的方法。真的需要将这两种资源分开吗?我认为 lambda 函数需要经常更改。
  2. 如果是,正确的做法是什么。
  3. 如果不是,我该如何处理进行更改的必要性。
  4. 使用输出和导入的方法将始终创建依赖项并且不允许删除。这是任何资源中的通用行为。这种情况我们该如何处理删除。用这种方式好不好
Description: Upload an object to an S3 bucket, triggering a Lambda event, returning the object key as a Stack Output.
Parameters:
Body:
Description: Stack to create s3 bucket and the lambda trigger
Type: String
Default: Test
BucketName:
Description: S3 Bucket name
Type: String
Default: image-process-bucket

Resources:
ImageProcessorExecutionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action: 'sts:AssumeRole'
Path: /
ManagedPolicyArns:
- "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
Policies:
- PolicyName: S3Policy
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- 's3:PutObject'
- 'S3:DeleteObject'
Resource: !Sub "arn:aws:s3:::${BucketName}/*"

ImageProcessor:
Type: AWS::Lambda::Function
Properties:
Description: Prints the filename
Handler: imageProcessor.handler
Role: !GetAtt ImageProcessorExecutionRole.Arn
Code: .
Runtime: nodejs12.x
Environment:
Variables:
BucketName:
Ref: BucketName
Outputs:
ImageProcessingARN:
Description: ARN of the function
Value:
Fn::Sub: ${ImageProcessor.Arn}
Export:
Name: ImageProcessingARN
ImageProcessingName:
Description: Name of the function
Value: !Ref ImageProcessor
Export:
Name: ImageProcessingName
AWSTemplateFormatVersion: '2010-09-09'
Description: Test
Parameters:
BucketName:
Description: Name of the bucket
Type: String
Default: imageprocess-bucket

Resources:
Bucket:
Type: AWS::S3::Bucket
DependsOn: BucketPermission
Properties:
BucketName: !Ref BucketName
NotificationConfiguration:
LambdaConfigurations:
- Event: 's3:ObjectCreated:*'
Function:
Fn::ImportValue: ImageProcessingARN

BucketPermission:
Type: AWS::Lambda::Permission
Properties:
Action: 'lambda:InvokeFunction'
FunctionName:
Fn::ImportValue: ImageProcessingName
Principal: s3.amazonaws.com
SourceAccount: !Ref "AWS::AccountId"
SourceArn: !Sub "arn:aws:s3:::${BucketName}"

最佳答案

  1. 没有所谓正确的方法,它几乎总是取决于您的独特情况。严格来说,不需要将不同CloudFormation模板中的资源分开。变化很大的 lambda 函数也不足以成为分离资源的理由。
  2. 您似乎正确地将资源分隔在两个不同的堆栈中。您只是不喜欢必须先删除 S3 存储桶,因为这会使调试变得更加困难。

  3. 如果我的假设是正确的,即您想要频繁删除或更新 Lambda CloudFormation 堆栈,但不想删除 S3 存储桶,那么至少有 2 个解决方案可以解决此问题:

    • 输入 Deletion Policy和一个UpdateReplacePolicy在您的 S3 存储桶上。通过添加这些策略,您可以删除 CloudFormation 堆栈,同时保留 S3 存储桶。这将允许您将 S3 存储桶和 Lambda 函数保留在一个 CloudFormation 模板中。要再次创建新堆栈,请从模板中删除 S3 存储桶资源并 manually import稍后将资源放回到 CloudFormation 堆栈中。
    • 使用Queue ConfigurationNotification Configuration 。如果您计划将 S3 存储桶模板中的 CloudFormation 模板与 Lambda 函数模板分开(根据更改频率和两个模板之间的依赖关系做出决定),这是一个很好的方法。放一个SQS queue在 S3 存储桶模板中。基于 S3 存储桶模板创建 CloudFormation 堆栈。在 Lambda 函数堆栈中使用 SQS arn(作为 CloudFormation 模板配置参数或使用 ImportValue 内部函数)并让 SQS trigger the Lambda function 。我认为这是最好的方法,因为您现在可以删除 Lambda 函数堆栈,而不必删除 S3 存储桶堆栈。这样,您可以有效减少两个 CloudFormation 堆栈之间的耦合,因为您可以使 S3 存储桶堆栈中的 SQS 不知道潜在的 Lambda 函数监听器。

    4:我认为仍然可以先删除S3存储桶CloudFormation堆栈,然后删除图像处理Lambda CloudFormation堆栈。尽管我认为这不是您通常想做的事情。

关于amazon-web-services - 云形成: separate cloudformation template of S3 bucket and Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61835381/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com