CloudFormation-始终使用最新的AMI

时间:2019-04-02 16:54:32

标签: amazon-web-services amazon-cloudformation ami ssm

博客文章Query for the latest Amazon Linux AMI IDs using AWS Systems Manager Parameter Store | AWS Compute Blog描述了如何始终在CloudFormation模板中引用发行版的最新版本。

# Use public Systems Manager Parameter
Parameters:
  LatestAmiId:
    Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
    Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'

Resources:
 Instance:
    Type: 'AWS::EC2::Instance'
    Properties:
      ImageId: !Ref LatestAmiId

这对RedHat和CentOS等其他发行版如何工作? 将使用什么参数存储路径?

2 个答案:

答案 0 :(得分:1)

正如@John Rotenstein所说,SSM似乎只有Amazon Linux AMI。但是您仍然可以使用DescribeImages来获得其他人。然后,您可以创建一个自定义资源来为您查询它,并将结果用作AMI值。

0

您将更新Resources: DescribeImagesRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Action: sts:AssumeRole Effect: Allow Principal: Service: lambda.amazonaws.com ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole Policies: - PolicyName: DescribeImages PolicyDocument: Version: '2012-10-17' Statement: - Action: ec2:DescribeImages Effect: Allow Resource: "*" GetLatestAMI: Type: AWS::Lambda::Function Properties: Runtime: python3.6 Handler: index.handler Role: !Sub ${DescribeImagesRole.Arn} Timeout: 60 Code: ZipFile: | import boto3 import cfnresponse import json import traceback def handler(event, context): try: response = boto3.client('ec2').describe_images( Owners=[event['ResourceProperties']['Owner']], Filters=[ {'Name': 'name', 'Values': [event['ResourceProperties']['Name']]}, {'Name': 'architecture', 'Values': [event['ResourceProperties']['Architecture']]}, {'Name': 'root-device-type', 'Values': ['ebs']}, ], ) amis = sorted(response['Images'], key=lambda x: x['CreationDate'], reverse=True) id = amis[0]['ImageId'] cfnresponse.send(event, context, cfnresponse.SUCCESS, {}, id) except: traceback.print_last() cfnresponse.send(event, context, cfnresponse.FAIL, {}, "ok") CentOSAmi: Type: Custom::FindAMI Properties: ServiceToken: !Sub ${GetLatestAMI.Arn} Owner: "679593333241" Name: "CentOS Linux 7 x86_64 HVM EBS *" Architecture: "x86_64" 中的值,以便找到正确的AMI,然后将输出用于:

CentOSAmi

答案 1 :(得分:0)

这些参数存储AMI值似乎是由AWS手动管理的。我只找到了对以下内容的引用: