从云形成中创建给定 EC2 的 AMI

Create AMI of a given EC2 from cloud formation

我必须从 cloudformation 创建给定 EC2 实例的 AMI,然后再从该 AMI 创建 ec2。这该怎么做?我的主要问题是第一部分

你不能这样做。

AWS CloudFormation 旨在以可重复的方式部署基础设施。它用于创建 new 基础设施。它不能用于修改现有 基础设施。

您需要在 CloudFormation 之外创建 Amazon EC2 实例的 AMI。然后,您可以使用 CloudFormation 使用此 AMI 启动新的 Amazon EC2 实例。

下面的代码是一个函数,可以作为 CustomResource 调用以创建 AMI。

好久没用了,应该还可以用。

您的 CustomResource 需要传入 RegionInstance(如果需要,还需要传入 Tags)。

为了从中创建一个新的 EC2 实例,您需要使用 ImageId 的 return 值并将其作为 AMI 输入到 AWS::EC2::Instance.

var Aws = require("aws-sdk");
var Response = require('cfn-response');

exports.handler = function (e, c) {

    console.log("REQUEST RECEIVED:\n" + JSON.stringify(e));

    // For Delete requests, immediately send a SUCCESS response.
    if (e.RequestType === "Delete") {
        Response.send(e, c, Response.SUCCESS);
        return;
    }

    console.log("Region=" + e.ResourceProperties.Region);
    console.log("Instance=" + e.ResourceProperties.Instance);

    var ec2 = new Aws.EC2({ region: e.ResourceProperties.Region });
    console.log("ec2=" + ec2);
    console.log("Tags=" + e.ResourceProperties.Tags);

    var params = {
        InstanceId: e.ResourceProperties.Instance,
        Name: e.ResourceProperties.AmiName
    };

    console.log("params=" + params);
    console.log("params.InstanceIds=" + params.InstanceIds);

    var responseStatus = "FAILED";

    ec2.createImage(params, function (err, data) {
        if (err) {
            console.log("createImage.err:" + err.toString(), err.stack.toString());
            Response.send(e, c, Response.FAILED);
        } // an error occurred
        else {
            console.log("createImage" + data);
            responseStatus = "SUCCESS";

            var responseData = {};
            responseData["ImageId"] = data.ImageId;

            var tagParams = {
                Resources: [data.ImageId],
                Tags: e.ResourceProperties.Tags
            }

            ec2.createTags(tagParams, function (err, data) {
                if (err) {
                    data = { Error: "DescribeImages call failed" };
                    console.log(data.Error + ":\n", err);
                    Response.send(e, c, Response.FAILED);
                } else {
                    console.log(data);
                    Response.send(e, c, Response.SUCCESS, responseData);
                }
            });
        }
    });
};