从 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。