从 lambda 函数调用 cloudformation
Invoking cloudformation from lambda function
我有一个 cloudformation 堆栈,其更新策略为滚动更新 (AutoScalingRollingUpdate)。这个堆栈从我们的组织中获取最新的 ami。回购并进行滚动更新。这个 运行 没问题,但涉及手动发明。有人需要手动转到 Cloudformation 控制台,每隔几天 运行 更新一次。我正在尝试自动执行此操作,这是我的想法:使用 Cloudwatch(cron 表达式)设置基于计划的规则并触发 lambda 函数。一旦被触发,lambda 应该调用现有的堆栈。我的问题是
1)这看起来可行吗?
2) 有没有人为此编写过任何 lambda 函数(最好在 python 中)?
附加高级架构
完全可行。 CloudFormation 模板看起来像这样:
Resources:
AmiUpdateLambdaFunction:
Type: AWS::Lambda::Function
Properties:
Code: ami_updater.py
Handler: ami_updater.lambda_handler
Runtime: python3.6
Timeout: 300
MemorySize: 128
AmiUpdateLambdaRole:
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
# Add policy for updating the Cloudformation stack
AmiUpdateTriggerEvent:
Type: AWS::Events::Rule
Properties:
ScheduleExpression: "rate(15 day)"
State: ENABLED
Targets:
- Arn: !GetAtt AmiUpdateLambdaFunction.Arn
Id: AmiUpdateTriggerEvent
AmiUpdateLambdaPermission:
Type: AWS::Lambda::Permission
Properties:
Action: lambda:InvokeFunction
FunctionName: !Ref AmiUpdateLambdaFunction
Principal: events.amazonaws.com
SourceArn: !GetAtt AmiUpdateTriggerEvent.Arn
至于 Python 代码,这将取决于如何找到您的 AMI,但这不应该是火箭科学。然后使用 boto3 使用 update_stack
方法 (documentation) 并在其中输入新的 AMI。
我有一个 cloudformation 堆栈,其更新策略为滚动更新 (AutoScalingRollingUpdate)。这个堆栈从我们的组织中获取最新的 ami。回购并进行滚动更新。这个 运行 没问题,但涉及手动发明。有人需要手动转到 Cloudformation 控制台,每隔几天 运行 更新一次。我正在尝试自动执行此操作,这是我的想法:使用 Cloudwatch(cron 表达式)设置基于计划的规则并触发 lambda 函数。一旦被触发,lambda 应该调用现有的堆栈。我的问题是 1)这看起来可行吗? 2) 有没有人为此编写过任何 lambda 函数(最好在 python 中)?
附加高级架构
完全可行。 CloudFormation 模板看起来像这样:
Resources:
AmiUpdateLambdaFunction:
Type: AWS::Lambda::Function
Properties:
Code: ami_updater.py
Handler: ami_updater.lambda_handler
Runtime: python3.6
Timeout: 300
MemorySize: 128
AmiUpdateLambdaRole:
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
# Add policy for updating the Cloudformation stack
AmiUpdateTriggerEvent:
Type: AWS::Events::Rule
Properties:
ScheduleExpression: "rate(15 day)"
State: ENABLED
Targets:
- Arn: !GetAtt AmiUpdateLambdaFunction.Arn
Id: AmiUpdateTriggerEvent
AmiUpdateLambdaPermission:
Type: AWS::Lambda::Permission
Properties:
Action: lambda:InvokeFunction
FunctionName: !Ref AmiUpdateLambdaFunction
Principal: events.amazonaws.com
SourceArn: !GetAtt AmiUpdateTriggerEvent.Arn
至于 Python 代码,这将取决于如何找到您的 AMI,但这不应该是火箭科学。然后使用 boto3 使用 update_stack
方法 (documentation) 并在其中输入新的 AMI。