14

Tôi đang sử dụng CloudFormation để quản lý ngăn xếp máy chủ web Tomcat nhưng mệt mỏi vì thực hiện quản lý AMI thô cho các phiên bản ứng dụng mới. Tôi muốn di chuyển theo hướng Chef nhưng không có thời gian ngay bây giờ. Thay vào đó, tôi đang cố gắng để chinh phục một vấn đề đơn giản trong instantserver instantiation: Làm thế nào tôi có thể tải xuống một WAR "hiện tại" khi các máy mới quay lên?Làm thế nào tôi có thể (an toàn) tải xuống một tài sản S3 riêng tư vào một cá thể EC2 mới với cloudinit?

Suy nghĩ của tôi là sử dụng thùng S3 và cloudinit riêng tư, nhưng tôi hơi bối rối vì phải làm gì với thông tin đăng nhập IAM. Tôi có thể đặt chúng trong dữ liệu người dùng của mẫu, nhưng tôi không muốn làm như vậy, đặc biệt là vì tôi là phiên bản kiểm soát tệp đó. Cách duy nhất tôi có thể nghĩ là sử dụng các biến môi trường trong chính AMI. Họ phải có bản rõ, nhưng ... eh, nếu bạn có thể đột nhập vào thể hiện của tôi, bạn có thể nén và tải xuống toàn bộ máy chủ web của tôi. Miễn là người dùng IAM không được sử dụng lại cho bất cứ điều gì khác và được luân chuyển thường xuyên, nó có vẻ giống như một cách hợp lý để giải quyết vấn đề. Tôi có thiếu gì không? Làm cách nào để tải xuống tài sản S3 riêng tư bằng cách sử dụng cloudinit?

Trả lời

15

Amazon gần đây đã công bố một tính năng mới nơi bạn có thể cung cấp "vai trò IAM" cho các phiên bản EC2 của mình. Điều này làm cho nó khá dễ dàng để cho phép các trường hợp cụ thể có quyền đọc tài nguyên S3 cụ thể.

Dưới đây là bài viết trên blog của họ công bố các tính năng mới:

http://aws.typepad.com/aws/2012/06/iam-roles-for-ec2-instances-simplified-secure-access-to-aws-service-apis-from-ec2.html

Đây là phần trong tài liệu EC2:

http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/UsingIAM.html#UsingIAMrolesWithAmazonEC2Instances

Đây là phần trong tài liệu IAM:

http://docs.amazonwebservices.com/IAM/latest/UserGuide/WorkingWithRoles.html

Vai trò IAM làm cho thông tin đăng nhập khả dụng cho cá thể thông qua HTTP, vì vậy bất kỳ người dùng hoặc quy trình nào chạy trên cá thể đều có thể thấy chúng.

+0

Có đầy đủ từ-đầu-to- kết thúc ví dụ hoặc hướng dẫn AWS CLI cho biết cách thiết lập và sử dụng cơ chế IAM? Tài liệu tham khảo này trông rất phức tạp và đầy đủ ví dụ sau lệnh theo lệnh sẽ rất được đánh giá cao. – pt12lol

5

Một cá thể có vai trò IAM có thông tin đăng nhập bảo mật tạm thời được tự động xoay. Chúng có sẵn thông qua http tại http://169.254.169.254/latest/meta-data/iam/security-credentials/RoleName, trong đó RoleName là bất cứ điều gì bạn gọi là vai trò của bạn. Vì vậy, họ dễ dàng để có được từ trường hợp của bạn, nhưng họ hết hạn thường xuyên.

Sử dụng chúng hơi khó khăn. CloudFormation không thể sử dụng thông tin đăng nhập tạm thời trực tiếp. Amazon AMI Linux có cài đặt boto Python và giờ đây đủ thông minh để tìm và sử dụng các thông tin đăng nhập đó cho bạn một cách tự động. Dưới đây là một one-liner bạn có thể đặt trong một kịch bản để lấy một tập tin từ S3 xô b, phím k đến tập tin địa phương f:

python -c "import boto;boto.connect_s3().get_bucket('b').get_key('k').get_contents_to_filename('f')" 

boto tìm và sử dụng thông tin tạm thời của vai trò cho bạn , làm cho nó thực sự dễ sử dụng.

+0

Phím "k" là gì? nó là một tập tin với thông tin đăng nhập tạm thời? – doNotCheckMyBlog

+1

Đối với người dùng trong tương lai, khóa k là tên tệp bạn muốn từ S3. Nếu bạn có cấu trúc thư mục thì khóa sẽ là, foldername/file.sh – doNotCheckMyBlog

14

Để cập nhật câu trả lời cho câu hỏi này một chút:

Cùng với vai trò IAM, mới AWS command-line client làm cho lấy những tài sản không đáng kể. Nó sẽ tự động kéo các thông tin AWS được cấp thông qua IAM từ môi trường và xử lý việc làm mới các thông tin đăng nhập đó.

Dưới đây là một ví dụ về lấy một tài sản duy nhất từ ​​một xô S3 an toàn trong một kịch bản sử dụng dữ liệu:

# Install the AWS command-line tools 
pip install awscli 

# Fetch the asset 
aws s3 cp --region us-east-1 s3://my-private-bucket/a-folder/an-asset.zip /some/destination 

đơn giản như vậy. Bạn cũng có thể sao chép toàn bộ nội dung thư mục từ S3 và tải lên, v.v. Xem the reference material để biết thêm chi tiết và tùy chọn.

+0

Vâng, các công cụ cli mới dựa trên 'botocore', có vẻ là nền tảng cho' boto' v3. Nhìn chung [botocore] (https://github.com/boto/botocore) là một giao diện tuyệt vời nếu bạn biết cấu trúc của API AWS. – Christopher

+0

Câu trả lời xuất sắc, ngắn gọn @James van Dyke. Nhưng tôi vẫn còn nghi ngờ về mức độ an toàn này, được minh họa trong câu hỏi tương tự của tôi ở đây: http://stackoverflow.com/questions/29932355/is-it-secure-to-store-ec2-user-data-shell-scripts- trong-một-tư-s3-xô – AJB

3

Để tải về một cách an toàn tài sản S3 tin vào một thể EC2 mới, bạn nên sử dụng IAM Roles for EC2 cấp phép S3 cần thiết để dụ EC2 của bạn, sau đó gọi aws s3 cp trong ví dụ của bạn UserDatacloudinit script để tải về các tài sản.

Để thiết lập một Role IAM cho EC2 từ một mẫu CloudFormation, sử dụng tài nguyên AWS::IAM::InstanceProfile, tham khảo một nguồn tài nguyên AWS::IAM::Role với một AssumeRolePolicyDocument ủy quyền truy cập vào ec2.amazonaws.com, với một chính sách được thiết kế để grant least privilege (trong trường hợp này, cho phép 's3:GetObject' chỉ dành cho các cụ Tài sản S3 đang được tải xuống).

Dưới đây là một ví dụ mẫu đầy đủ mà tải một tài sản S3 lên một thể EC2 mới sử dụng cloudinit, trở về nội dung của nó như là một Stack Output:

Launch Stack

Description: (securely) download a private S3 asset onto a new EC2 instance with cloudinit 
Parameters: 
    S3Bucket: 
    Description: S3 bucket name 
    Type: String 
    S3Key: 
    Description: S3 object key 
    Type: String 
Mappings: 
    # amzn-ami-hvm-2016.09.1.20161221-x86_64-gp2 
    RegionMap: 
    us-east-1: 
     "64": "ami-9be6f38c" 
Resources: 
    EC2Role: 
    Type: AWS::IAM::Role 
    Properties: 
     AssumeRolePolicyDocument: 
     Version: 2012-10-17 
     Statement: 
     - Effect: Allow 
      Principal: {Service: [ ec2.amazonaws.com ]} 
      Action: ["sts:AssumeRole"] 
     Path:/
     Policies: 
     - PolicyName: EC2Policy 
     PolicyDocument: 
      Version: 2012-10-17 
      Statement: 
      - Effect: Allow 
      Action: ['s3:GetObject'] 
      Resource: !Sub 'arn:aws:s3:::${S3Bucket}/${S3Key}' 
    RootInstanceProfile: 
    Type: AWS::IAM::InstanceProfile 
    Properties: 
     Path:/
     Roles: [ !Ref EC2Role ] 
    WebServer: 
    Type: AWS::EC2::Instance 
    Properties: 
     ImageId: !FindInMap [ RegionMap, !Ref "AWS::Region", 64 ] 
     InstanceType: m3.medium 
     IamInstanceProfile: !Ref RootInstanceProfile 
     UserData: 
     "Fn::Base64": 
      !Sub | 
      #!/bin/bash 
      DATA=$(aws s3 cp s3://${S3Bucket}/${S3Key} -) 
      /opt/aws/bin/cfn-signal \ 
       -e $? \ 
       -d "$DATA" \ 
       '${Handle}' 
    Handle: 
    Type: AWS::CloudFormation::WaitConditionHandle 
    Wait: 
    Type: AWS::CloudFormation::WaitCondition 
    Properties: 
     Handle: !Ref Handle 
     Timeout: 300 
Outputs: 
    Result: 
    Value: !GetAtt Wait.Data 
Các vấn đề liên quan