从lambda函数调用cloudformation

时间:2018-03-22 21:29:29

标签: python-3.x amazon-web-services aws-lambda amazon-cloudformation

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

附加高级架构enter image description here

1 个答案:

答案 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。