我有一个cloudformation堆栈,其更新策略为滚动更新(AutoScalingRollingUpdate)。这个堆栈从我们的组织中获取最新的ami。回购并进行滚动更新。这很好,但涉及手动发明。有人需要手动转到Cloudformation控制台并每隔几天运行一次更新。我正在尝试自动执行此操作,这是我的想法:使用Cloudwatch(cron表达式)设置基于计划的规则并触发lambda函数。一旦触发,lambda应该调用现有的堆栈。我的问题是 1)这看起来可行吗? 2)有没有人写过任何lambda函数(最好是在python中)?
答案 0 :(得分:1)
完全可行。 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。