Cách bắt đầu và dừng phiên bản AWS EC2 dựa trên lịch trình dựa trên thời gian


17

Có cách nào dễ dàng để bắt đầu và dừng các phiên bản AWS EC2 tại một thời điểm nhất định mỗi ngày không? Điều này có thể giúp tôi tiết kiệm khá nhiều tiền cho các máy chủ phát triển và thử nghiệm của mình.

Câu trả lời:


16

Cập nhật

AWS đã phát hành một công cụ gọi là " Lập lịch lập trường ", bao gồm một hướng dẫn cấu hình đầy đủ được liên kết từ trang đó. Nó có vẻ là một cải tiến của Bộ lập lịch EC2 mà tôi mô tả bên dưới, với một vài tính năng khác, nhưng về cơ bản nó là cùng một thứ.

Hướng dẫn bên dưới vẫn sẽ hoạt động, nhưng có lẽ tốt hơn là xem lịch trình cá thể để cài đặt mới.

Bài gốc

AWS có một công cụ gọi là Bộ lập lịch EC2 cho phép bạn kiểm soát rất linh hoạt khi bắt đầu và dừng các phiên bản EC2.

Công cụ cho phép bạn xác định thời gian bắt đầu và dừng mặc định khi bạn thiết lập công cụ, bạn có thể thay đổi sau này. Bạn có thể chọn trường hợp nào được kiểm soát, bạn và bạn có thể chỉ định thời gian bắt đầu và dừng khác nhau cho mỗi phiên bản bằng cách sử dụng thẻ.

Mặc dù nó là một công cụ tuyệt vời nhưng tài liệu này hơi mơ hồ và khó hiểu. Nó giống như tài liệu đã được viết bởi một kỹ sư viết công cụ và biết mọi thứ về nó, hơn là một nhà văn kỹ thuật.

Lưu ý : nếu bạn có phản hồi hoặc bình luận sửa chữa được đánh giá cao. Nếu bạn có một câu hỏi dựa trên điều này, xin vui lòng bắt đầu câu hỏi của riêng bạn.

Bộ lập lịch EC2 là gì

Công cụ này là Chức năng Lambda hoạt động với Sự kiện Cloudwatch và DynamoDB. Nó được triển khai bằng cách sử dụng mẫu Cloudform, cũng thiết lập các vai trò và chính sách IAM cần thiết. Bạn có thể đọc về kiến ​​trúc ở đây .

Kiến trúc lập lịch AWS EC2

Triển khai

Bắt đầu bằng cách vào trang này và nhấp vào "giải pháp khởi chạy". Ngay bây giờ liên kết trực tiếp ở đây , nhưng nó có thể thay đổi.

Chọn khu vực bạn muốn các tài nguyên được triển khai ở đầu bảng điều khiển. Kịch bản kiểm soát các thể hiện EC2 ở bất kỳ khu vực nào, nhưng nó chạy trong một khu vực.

Gắn thẻ EC2

Điều này được đề cập trong tài liệu ở đây , nhưng nó không đơn giản như nó có thể.

Bạn kiểm soát những trường hợp nào được bắt đầu và dừng lại bằng cách gắn thẻ các phiên bản của bạn.

Trường hợp đơn giản nhất yêu cầu bạn gắn thẻ cho từng phiên bản EC2 mà bạn muốn được bắt đầu và dừng theo lịch trình. Để thực hiện việc này, hãy tìm phiên bản EC2 của bạn trong bảng điều khiển, nhấp vào thẻ và tạo thẻ này

Gắn thẻ sơ thẩm EC2 cho Trình lập lịch biểu

Để cho phép sao chép và dán:

  • Phím: lịch trình: ec2-startstop
  • Giá trị: đúng

Nếu bạn muốn bắt đầu và dừng phiên bản cụ thể trên một lịch trình khác, bạn sẽ thêm thông tin bổ sung vào khóa và giá trị thẻ. Ví dụ: nếu bạn muốn một phiên bản bắt đầu ở 1500 UTC và dừng ở 2400 UTC vào thứ ba, thứ năm và thứ sáu, bạn nhập thông tin sau.

Khóa: lên lịch: ec2-startstop: trễ Giá trị: 1500; 2400; utc; tue, thu, fri

Lưu ý rằng từ "trễ" có thể là bất kỳ chuỗi nào, "trễ" không có nghĩa đặc biệt.

Bạn có thể chuyển đổi UTC sang giờ địa phương bằng công cụ này .

Bạn có thể sử dụng trình chỉnh sửa thẻ cho các trường hợp thẻ số lượng lớn. Điều đó có thể dễ dàng hơn cho phép bạn thiết lập gắn thẻ hàng loạt, có thể hữu ích cho việc có các cài đặt khác nhau cho nhà phát triển, thử nghiệm và sản xuất. Tôi nghi ngờ bạn sẽ sử dụng điều này trên sản xuất mặc dù.

Thông số CloudFormation

Khi bạn chạy mẫu CloudFormation, bạn phải nhập rất nhiều tham số. Hầu hết bạn có thể để mặc định. Đây là một số tham số quan trọng nhất

  • Tên ngăn xếp: gọi nó là bất cứ điều gì bạn thích. Đó chỉ là những gì nó được gọi trong CloudFormation.
  • Tên thẻ tùy chỉnh: đây là "khóa" của thẻ bạn đặt so với phiên bản EC2. Để nó ở giá trị mặc định trừ khi bạn có lý do chính đáng hoặc cần nhiều cài đặt.
  • Thời gian bắt đầu / dừng mặc định: Thời gian UTC mặc định để bắt đầu và dừng các phiên bản
  • DynamoDB: cài đặt được lưu trữ trong DynamoDB. Bạn có thể thay đổi tên bảng và như vậy. Bởi vì lớp miễn phí DynamoDB không hết hạn, hầu hết mọi người dường như không bị tính phí.
  • (màn hình thứ hai) Quyền - đây là cá trích đỏ, xem phần bên dưới. Để nó như mặc định và được chạy với tư cách quản trị viên khi bạn cố gắng thiết lập Bộ lập lịch EC2.
  • Tùy chọn thông báo: Tôi thấy hữu ích khi thiết lập thông báo SNS để tôi có thể xác thực nó đang hoạt động. Tôi đã không dành thời gian để tìm cách vô hiệu hóa chúng, tôi vừa xóa nó để chạy lại mẫu Cloudform để cài đặt lại.

Quyền, Chính sách và Vai trò

Phần vai trò Quyền / IAM của mẫu CloudFormation là cá trích đỏ - nghĩa là phần lớn không liên quan. Nó chỉ xác định vai trò được sử dụng để chạy tập lệnh CloudFormation, nó không tạo ra sự khác biệt đối với các tài nguyên được tạo hoặc vai trò được sử dụng khi hàm lambda chạy. Nhìn lại điều này là hiển nhiên, nhưng nó không rõ ràng đối với tôi khi tôi bắt đầu.

Bất cứ vai trò nào bạn chạy tập lệnh này đều có cùng vai trò và quyền nội tuyến được tạo trong IAM. Hàm Lambda chạy bằng "vai trò lập lịch ec2" mà tập lệnh tạo.

Tôi đã bao gồm các chính sách của mình dưới đây trong trường hợp chúng hữu ích cho bất kỳ ai.

Sự kiện và số liệu của CloudWatch

Nếu bạn muốn xem nhật ký từ Chức năng Lambda của mình, hãy vào Sự kiện trên Cloudwatch. Việc đăng nhập khá tốt. Cũng có các số liệu, vì vậy bạn có thể thấy khi nào nó chạy, thời gian nó chạy, v.v.

Bổ sung

Mã cho chức năng lambda có sẵn trên Github .

Chính sách

Chúng thường không cần thiết, nhưng có thể dành cho ai đó vì vậy tôi sẽ đưa chúng vào.

Chính sách cho vai trò IAM

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeTags",
                "iam:CreateRole",
                "iam:GetRole",
                "iam:PassRole",
                "iam:PutRolePolicy",
                "iam:DeleteRolePolicy",
                "iam:DeleteRole",
                "dynamodb:*",
                "lambda:*",
                "SNS:Publish",
                "events:*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "S3:GetObject",
            "Resource": [
                "arn:aws:s3:::solutions-us-west-2",
                "arn:aws:s3:::solutions-us-west-2/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:StopInstances",
                "ec2:StartInstances"
            ],
            "Resource": [
                "arn:aws:ec2:us-west-2:123456789012:instance/i-0d112345Ab6789012"
            ]
        }
    ]
}

Chính sách ủy thác cho vai trò IAM

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "lambda.amazonaws.com",
          "cloudformation.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Amazon đã thay đổi mọi thứ - "Bộ lập lịch EC2 đã được thay thế bởi Bộ lập lịch lập trường AWS"
Max Barraclough

Cảm ơn Max, tôi đã cập nhật câu trả lời để bao gồm một liên kết. Nó đi kèm với một hướng dẫn thực hiện đầy đủ vì vậy tôi không nghĩ rằng tôi cần cung cấp hướng dẫn đầy đủ.
Tim

1
Thật không thể tin được là họ thích làm phức tạp mọi thứ như thế nào ...
Mehdi

9

Nếu bạn chỉ muốn bắt đầu và dừng các trường hợp, thì đây là một cách khác để sử dụng dịch vụ Lambda. Nó giả sử bạn muốn kiểm soát một id cá thể cụ thể. Bạn có thể kiểm soát nhiều trường hợp bằng cách thêm nhiều id được phân tách bằng dấu phẩy. (ví dụ: 'i-3453453', 'i-45656745'). Bạn có thể tìm thấy id của cá thể của bạn trong phần Trường hợp bảng điều khiển AWS.

Trong bảng điều khiển Lambda

  1. Mở bảng điều khiển AWS Lambda và chọn Tạo chức năng.
  2. Chọn tác giả từ đầu.
  3. Nhập tên cho chức năng của bạn, chẳng hạn như "StopEC2Instances."
  4. Đối với Thời gian chạy, chọn Python 2.7
  5. Mở rộng menu thả xuống Vai trò và chọn Tạo vai trò tùy chỉnh. Điều này sẽ mở một tab hoặc cửa sổ mới trong trình duyệt của bạn.
  6. Trong menu thả xuống Vai trò IAM, chọn Tạo Vai trò IAM mới và nhập Tên vai trò, chẳng hạn như lamb lambda_start_stop_ec2. "
  7. Chọn Xem Tài liệu Chính sách, Chỉnh sửa, rồi chọn Ok khi được nhắc đọc tài liệu. Thay thế tất cả các văn bản trong chính sách bằng:

Mã dưới đây

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:Start*",
        "ec2:Stop*"
      ],
      "Resource": "*"
    }
  ]
}
  1. Chọn Cho phép để hoàn tất việc tạo vai trò và quay lại bảng điều khiển AWS Lambda.
  2. Để dừng phiên bản của bạn, thay thế tất cả văn bản trong Trình chỉnh sửa mã chức năng bằng cách sau:

Mã dưới đây

import boto3
region = ' eu-west-1'
instances = ['i-0dd344443184503fa']

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=region)
    ec2.stop_instances(InstanceIds=instances)
    print 'stopped your instances: ' + str(instances)

Hãy nhớ thay thế các giá trị khu vực và cá thể bằng của riêng bạn.

  1. Từ menu thả xuống Runtime, chọn Python2.7.
  2. Trong cài đặt Cơ bản, nhập 10 giây cho chức năng Hết giờ.
  3. Chọn Lưu.
  4. Lặp lại tất cả các bước để tạo một chức năng khác sẽ bắt đầu phiên bản của bạn, nhưng sau đó sử dụng tập lệnh python này để bắt đầu tất cả:

Mã dưới đây

import boto3
region = 'eu-west-1'
instances = [' i-0dd344443184503fa']

def lambda_handler(event, context):
    ec2 = boto3.client('ec2', region_name=region)
    ec2.start_instances(InstanceIds=instances)
    print 'started your instances: ' + str(instances)

Lịch trình các chức năng

Tại đây bạn sẽ tạo Sự kiện CloudWatch sẽ kích hoạt chức năng Lambda của bạn vào ban đêm

  1. Mở bảng điều khiển Amazon CloudWatch.
  2. Chọn Sự kiện và sau đó chọn Tạo quy tắc.
  3. Chọn lịch trình trong Nguồn sự kiện.
  4. Nhập một khoảng thời gian hoặc biểu thức cron cho Lambda biết khi nào nên dừng phiên bản của bạn. Để biết thêm thông tin về cú pháp chính xác, hãy xem Cú pháp biểu thức lịch biểu cho các quy tắc.

Lưu ý: Biểu thức Cron được đánh giá trong UTC. Hãy chắc chắn điều chỉnh biểu thức cho múi giờ ưa thích của bạn. Dưới đây là một ví dụ sẽ chạy chức năng mỗi ngày vào lúc 08:00 GMT / UTC):

0 08 * * ? *
  1. Chọn Thêm mục tiêu, và sau đó chọn chức năng Lambda.
  2. Đối với Chức năng, chọn chức năng Lambda dừng phiên bản của bạn.
  3. Chọn cấu hình chi tiết.
  4. Nhập thông tin sau vào các trường được cung cấp: Đối với Tên, nhập tên có ý nghĩa, chẳng hạn như "StopEC2Instances." Đối với Mô tả, hãy thêm một mô tả có ý nghĩa, chẳng hạn như các điểm dừng EC2 mỗi ngày vào ban đêm. Đối với Bang, chọn Kích hoạt.
  5. Chọn Tạo quy tắc.

Để khởi động lại phiên bản của bạn vào buổi sáng, hãy lặp lại các bước này và sử dụng thời gian bắt đầu ưa thích của bạn. Nếu bạn muốn gửi tin nhắn thư bất cứ khi nào các chức năng thất bại, bạn có thể thiết lập một chủ đề SNS và định cấu hình gửi tin nhắn đó trong Gỡ lỗi trong Cửa sổ tạo chức năng Lmbda.

Nguồn gốc của tất cả những điều này có thể được tìm thấy ở đây: Tài liệu AWS


Làm thế nào trên trái đất bạn có thể có được mã Python trông ổn trong trình soạn thảo, giống như nó vừa mới bật ra?
netfed

Nhấp vào trợ giúp '?' và bạn sẽ tìm thấy nhiều hơn về việc sử dụng định dạng markdown. serverfault.com/editing-help
jscott

1
Đó là một lỗi trong mã định dạng. Bạn phải đặt văn bản đơn giản giữa các định dạng khác nhau - trong trường hợp này là khối mã và khối được đánh số. Đó là lý do tại sao tôi đặt "mã bên dưới" vào - không có ý nghĩa, ở tất cả mọi nơi, nhưng nó hoạt động.
Tim

@Tim Cảm ơn đã làm rõ. Tôi không biết điều đó. Nó cũng giải quyết định dạng của biểu thức cron. Cảm ơn một lần nữa.
netfed
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.