我在 AWS 上有一个 EBS 根服务器,服务台工作人员使用它来执行不频繁的任务,我只希望在他们需要时才打开它。
我希望服务台能够访问一个网页,上面写着
[Start the server]
单击该按钮将启动服务器,并使用 Amazon Route 53 将 CNAME 设置为它所到达的任何地址。此页面可以提示输入用户名和密码,或者具有硬编码的 IAM 帐户。
如果该系统能够在可编程的小时数后停止服务器,那么对专家来说这将是额外的帮助。
在我写这篇文章之前 - 我希望 JS SDK 意味着简单的情况可以在一个网页中完成 - 有没有其他人写过这个或看到过可以做到这一点的东西?
答案1
Eric Hammond 对使用 AWS 自动扩展按计划运行实例提出了一些建议这里
我会避免创建 DNS 记录,因为更改传播需要时间,并且 DNS 服务器缓存行为不一致。
考虑使用弹性 IP 并为该 IP 注册 A 记录。实例启动时,为其分配 IP(可以在 cloud-init/user-data 脚本中执行此操作)。未连接时,您需要为 EIP 支付少量的每小时费用,但这比每小时实例费用要少得多。
我认为服务台网页可能仅使用基于浏览器的 JavaScript 代码即可创建,但您必须注意浏览器对跨站点脚本的限制。我从未见过这样的情况。
如果您有一些持续运行的服务器/主机,则可以使用它来处理启动和停止实例。我之前运行过一个小实用程序,它可以监视电子邮件收件箱中触发启动或停止 EC2 实例的消息。如果您有一个具有 shell 访问权限的廉价 Web 主机,则可以设置一个 cron 脚本来执行此操作。
答案2
答案3
这是一个非常古老的问题,但它只是被提出来而已。
如果经常使用,你可以使用AWS 实例调度程序. 但听起来好像不是。
实现此目的的一个非常简单的方法是将批处理文件放在共享驱动器上,他们可以双击它。它应该包含类似以下内容的内容,用于设置CLI 环境变量和启动实例
AWS_ACCESS_KEY_ID=AYIAIW6G6JMJKBADF
AWS_SECRET_ACCESS_KEY=ABC123ABC123
aws ec2 start-instances --instance-ids i-1234567890abcdef0
缺点是您可能需要在每台 PC 上安装 AWS CLI,但您可以设法将其放在与批处理文件相同的文件夹中……也许吧。或者让他们通过 RDP 进入服务器。这不太方便,但如果偶尔使用,也许就足够了。即使只有一台安装了它的 PC,他们也可以走到那里。
您需要将访问密钥与权限非常有限的用户关联。使用配置文件锁定用户,让他们有权运行e start-instances API 调用。您可能会发现需要其他几个允许的调用,但这表明这应该足够了。其他建议你可能需要授予 iam:PassRole
每晚运行一个批处理文件,使用以下命令关闭实例停止实例命令。
这不如网页优雅,但实现起来却简单得多。
答案4
您已经在一定程度上回答了您自己的问题。
你可以用任何 SDK 轻松完成此操作,并且你已经命名了JS 开发工具包所以我认为你会倾向于 JS。
我不是一名 Web 开发人员,但使用 Go/Python 编写了许多控制 EC2 和 R53(以及其他 AWS 服务)的脚本,但是不管使用什么工具,这都是一项简单的任务...
以下是帮助您入门的总体工作流程:
- 收集用户操作,收集当前实例状态
- 根据用户操作启动/停止
- 如果是启动操作,则获取公网 IP 并更新 DNS 记录 (R53)
以下是一些可供参考的文档和示例:
使用该类AWS.EC2
,您可以调用startInstance()
启动指定实例。
startInstance()
文件:
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/OpsWorks.html#startInstance-property
对于 DNS,使用AWS.Route53
class 和 call changeResourceRecordSets()
:
创建、更改或删除资源记录集
为了在 X 小时后关闭服务器的计划任务。您再次需要开发它,但这将是您的流程。此脚本需要在 Lambda 中运行,或作为服务器上的 cron 作业运行(或者服务器本身,因为它仅停止!)
- 收集实例的开始时间
- 获取现在时间
- 如果开始时间 < now() - 间隔X小时后,停止实例。
与这些任务相关的方法:
ec2.describeInstances()
ec2.stopInstance()
这里有一个示例库:
https://github.com/awsdocs/aws-doc-sdk-examples/tree/master/javascript/example_code
以下是上述示例集的一个片段:
// Create EC2 service object
var ec2 = new AWS.EC2({apiVersion: '2016-11-15'});
// Instead of params, you can use the user input from your page.
var params = {
InstanceIds: [process.argv[3]],
DryRun: true
};
if (process.argv[2].toUpperCase() === "START") {
// Call EC2 to start the selected instances
ec2.startInstances(params, function(err, data) {
if (err && err.code === 'DryRunOperation') {
params.DryRun = false;
ec2.startInstances(params, function(err, data) {
if (err) {
console.log("Error", err);
} else if (data) {
console.log("Success", data.StartingInstances);
}
});
} else {
console.log("You don't have permission to start instances.");
}
});
} else if (process.argv[2].toUpperCase() === "STOP") {
// Call EC2 to stop the selected instances
ec2.stopInstances(params, function(err, data) {
if (err && err.code === 'DryRunOperation') {
params.DryRun = false;
ec2.stopInstances(params, function(err, data) {
if (err) {
console.log("Error", err);
} else if (data) {
console.log("Success", data.StoppingInstances);
}
});
} else {
console.log("You don't have permission to stop instances");
}
});
}