【问题标题】:Invoking cloudformation from lambda function从 lambda 函数调用 cloudformation
【发布时间】:2018-09-01 11:44:58
【问题描述】:

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

附加一个高层架构

【问题讨论】:

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


    【解决方案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。

    【讨论】:

    • 完全有效,尽管我对此的改动很小。
    • 这实际上是调用 lambda,还是只是授予调用它的权限?
    • AmiUpdateTriggerEvent 事件规则,实际调用它
    猜你喜欢
    • 2018-03-22
    • 1970-01-01
    • 2017-10-14
    • 2018-10-02
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 2017-07-23
    相关资源
    最近更新 更多