Chọn trang

 

🚀 Bước 1: Thiết lập Người dùng và Quyền hạn trong AWS

 

Trước hết, bạn cần tạo một người dùng IAM chuyên dụng và cấp cho nó các quyền cần thiết để tương tác với các dịch vụ AWS.

  1. Tạo người dùng IAM: (mục đích sử dụng để thiết lập AWS account trên n8n)
    • Truy cập AWS Management Console, vào dịch vụ IAM, sau đó chọn Users từ menu bên trái và nhấp vào Create user.
    • Đặt tên cho người dùng (ví dụ: n8n-ec2-controller) và nhấn Next.
  2. Gán quyền hạn (policies):
    • Chọn Attach policies directly.
    • Trong ô tìm kiếm, gõ và chọn các policy sau:
      • AWSLambda_FullAccess: Cấp quyền để n8n có thể gọi hàm Lambda.
      • AmazonEC2FullAccess: Cấp quyền để Lambda có thể bật/tắt máy chủ EC2.
    • Nhấn Next, sau đó Create user.
  3. Tạo khóa truy cập (Access Key):
    • Vào lại mục Users, chọn người dùng vừa tạo.
    • Mở tab Security credentials và nhấn Create access key.
    • Chọn Third-party service hoặc Application running on my own premises, sau đó nhấn Next.
    • Nhấn Create access keysao chép Access key IDSecret access key được hiển thị. Lưu ý: Lưu lại Secret key ngay lập tức vì bạn sẽ không thể xem lại nó.
      (sử dụng để thiết lập AWS account trên n8n)

 

 

  1. Tạo IAM Role: (liên kết với Lambda)
    • Trong giao diện IAM, bạn click vào nút Create role ở góc trên cùng bên phải.
  2. Chọn Dịch Vụ
    • Trong phần Select trusted entity, chọn AWS service.

    • Trong phần Use case, chọn Lambda, sau đó nhấn Next. Điều này sẽ đảm bảo role được cấu hình để sử dụng với AWS Lambda.

    • Tìm và gắn các Policies:

          Đây là bước quan trọng nhất.

      • Trong thanh tìm kiếm “Add permissions”, bạn gõ AWSLambdaBasicExecutionRole. Chọn chính sách này từ danh sách kết quả. * Tiếp tục tìm kiếm và chọn AmazonEC2FullAccess (hoặc một chính sách có quyền hạn thấp hơn như AmazonEC2ReadOnlyAccess nếu bạn chỉ muốn đọc thông tin).

      • Sau khi đã chọn cả hai chính sách, nhấn Next.

        4: Đặt tên và tạo Role

        • Đặt tên cho Role của bạn (ví dụ: Lambda_EC2_Control_Role).

        • Bạn có thể thêm mô tả nếu cần.

        • Kiểm tra lại các chính sách đã gắn và nhấn Create role để hoàn tất.

        Sau khi role này được tạo, bạn có thể gán nó cho hàm Lambda để hàm có đủ quyền truy cập cần thiết vào dịch vụ EC2

     

     


     

    🛠️ Bước 2: Viết và Triển khai Hàm Lambda

     

    Bạn sẽ viết hai hàm Lambda bằng Python để xử lý các lệnh bật và tắt máy chủ.

    1. Tạo Hàm start-ec2-instance:
      • Trong AWS, vào Lambda, chọn Create function.
      • Chọn Author from scratch, đặt tên start-ec2-instance, chọn Python 3.12 làm Runtime và chọn Role IAM bạn đã tạo ở bước trên.
      • Dán đoạn code sau vào:

      Đây là đoạn code đã được tối ưu hóa để xử lý cả hai trường hợp: một chuỗi hoặc một danh sách các ID.

      Python

      import boto3
      
      def lambda_handler(event, context):
          ec2 = boto3.client('ec2', region_name='us-east-2')
          
          try:
              # Lấy giá trị từ payload với khóa 'instance_ids'
              instance_ids = event['instance_ids']
              
              # Nếu giá trị là một chuỗi, bọc nó trong một danh sách
              if isinstance(instance_ids, str):
                  instance_ids = [instance_ids]
              
              # Bật các máy chủ EC2
              ec2.start_instances(InstanceIds=instance_ids)
              
              print(f'Starting EC2 instances: {instance_ids}')
              
              return {
                  'statusCode': 200,
                  'body': f'Successfully started instances {instance_ids}'
              }
          except Exception as e:
              print(f'Error starting instances: {e}')
              
              return {
                  'statusCode': 500,
                  'body': f'Error starting instances: {e}'
              }
      

       

      • Trong Configuration > General configuration, tăng Timeout lên 10 giây.
      • Nhấn Deploy để lưu và triển khai hà
    2. Tạo Hàm stop-ec2-instance:
      • Lặp lại các bước trên, đặt tên là stop-ec2-instance và thay thế ec2.start_instances bằng ec2.stop_instances trong code.

    Python

    import boto3
    
    def lambda_handler(event, context):
        ec2 = boto3.client('ec2', region_name='us-east-2')
        
        try:
            # Lấy giá trị từ payload với khóa 'instance_ids'
            instance_ids = event['instance_ids']
            
            # Nếu giá trị là một chuỗi, bọc nó trong một danh sách
            if isinstance(instance_ids, str):
                instance_ids = [instance_ids]
            
            # Tắt các máy chủ EC2
            ec2.stop_instances(InstanceIds=instance_ids)
            
            print(f'Stopping EC2 instances: {instance_ids}')
            
            return {
                'statusCode': 200,
                'body': f'Successfully stopped instances {instance_ids}'
            }
        except Exception as e:
            print(f'Error stopping instances: {e}')
            
            return {
                'statusCode': 500,
                'body': f'Error stopping instances: {e}'
            }
    • Trong Configuration > General configuration, tăng Timeout lên 10 giây.
    • Nhấn Deploy để lưu và triển khai hàm

     


     

    ⚙️ Bước 3: Cấu hình Workflow trong n8n

     

    Bước này sẽ kết nối các thành phần đã tạo để tự động hóa quy trình.

    1. Thiết lập AWS Credential trong n8n:

      • Trong n8n, vào Credentials, chọn Create New và tìm AWS Credential.

      • Dán Access key IDSecret access key bạn đã lấy ở Bước 1 vào.

    2. Tạo Workflow:

      • Thêm node Schedule Trigger để đặt lịch trình. Ví dụ, để chạy vào 19h30 hàng ngày, đặt Trigger IntervalCustom (Cron)Expression0 30 19 * * ?.

      • Thêm node AWS Lambda và kết nối nó với node Schedule Trigger.

    3. Cấu hình Node AWS Lambda:

      • Credential: Chọn credential AWS bạn đã tạo.

      • Function Name: Nhập tên hàm Lambda (ví dụ: stop-ec2-instance).

      • Qualifier: Nhập $LATEST để sử dụng phiên bản hàm mới nhất.

      • Invocation Type: Chọn RequestResponse.

      • JSON Input: Đây là nơi bạn truyền ID máy chủ.

        • Kịch bản 1 (một ID):

          JSON

          {
            "instance_ids": "i-0a5c09e1829af388b"
          }
          

        • Kịch bản 2 (nhiều ID):

          JSON

          {
            "instance_ids": ["i-0a5c09e1829af388b", "i-0180b664bdcd04d8e"]
          }
          

    Sau khi hoàn tất, hãy kích hoạt (activate) workflow và nó sẽ tự động chạy theo lịch trình bạn đã đặt.