7

Chúng tôi đang thích ứng với các mẫu ứng dụng CloudFormation của chúng tôi để sử dụng VPC. Trong khuôn mẫu này, chúng ta cần tạo các khối CIDR theo chương trình được sử dụng cho các mạng con VPC của chúng ta, để đảm bảo chúng không xung đột giữa các ngăn xếp CloudFormation.Tạo các khối CIDR mạng phụ theo lập trình trong các mẫu CloudFormation (hoặc thêm các số nguyên với nhau)

kế hoạch ban đầu của tôi đã được để tạo ra CIDRs bởi chuỗi concatenating với nhau, ví dụ:

"ProxyLoadBalancerSubnetA" : { 
    "Type" : "AWS::EC2::Subnet", 
    "Properties" : { 
    "VpcId" : { "Ref" : "Vpc" }, 
    "AvailabilityZone" : "eu-west-1a", 
    "CidrBlock" : { "Fn::Join" : [ ".", [ { "Ref" : "VpcCidrPrefix" }, "0.0/24" ] ] } 
    } 
}, 

Sau khi xem xét thêm tuy nhiên, chúng ta cần phải sử dụng một VPC đơn hơn là có một VPC cho mỗi ngăn xếp của chúng tôi .

AWS hạn chế VPC sử dụng tối đa /16 khối CIDR (chúng tôi đã yêu cầu giới hạn này được nêu ra, nhưng rõ ràng là không thể). Điều này có nghĩa là chúng ta không thể sử dụng phương thức ghép nối này nữa vì mỗi ngăn xếp của chúng ta yêu cầu các mạng con có tổng cộng hơn 255 địa chỉ.

Tôi muốn tạo ra các khối CIDR on-the-fly thay vì phải xác định chúng như tham số cho các mẫu CloudFormation,

Một ý tưởng tôi đã có được mỗi ngăn xếp có một "cơ sở nguyên" và thêm cho điều đó đối với mỗi khối CIDR của mỗi mạng con.

Ví dụ:

"CidrBlock" : { "Fn::Join" : [ ".", [ { "Ref" : "VpcCidrPrefix" }, { "Fn::Sum", [ { "Ref" : "VpcCidrStart" }, 3 ] }, "0/24 ] ] } 

đâu VpcCidrStart là một số nguyên mà bộ giá trị mà các CIDR octet thứ ba nên bắt đầu từ bên trong kịch bản, và 3 là số subnet. Rõ ràng là chức năng nội tại không tồn tại, vì vậy tôi muốn biết nếu có ai có giải pháp để thêm các số nguyên trong VPC (có vẻ như không thể thực hiện được, vì CloudFormation là chuỗi định hướng), hoặc một giải pháp tốt hơn cho câu hỏi hóc búa này nói chung.

Trả lời

2

Giải pháp của tôi cho các loại vấn đề này là sử dụng ngôn ngữ lập trình hợp pháp để biên dịch mẫu thành tài liệu JSON CloudFormation. Tôi đã sử dụng PHP 5.4, Twig và Symfony Console, nhưng YMMV.

Về cơ bản, bạn làm toán trước thời gian trong ngôn ngữ lập trình, sau đó sử dụng dữ liệu đó khi bạn ghi ra tài liệu JSON của mình.

+0

tôi đã bắt đầu làm việc trên một Ứng dụng "Stack Manager" để xử lý các điều kiện trong đó môi trường sản xuất và dàn dựng cần thiết lập hơi khác và tự động "tắt đèn" các môi trường không sản xuất vào ban đêm - vì vậy tôi nghĩ giải pháp này có ý nghĩa đối với chúng tôi. Một sự xấu hổ mà CloudFormation thiếu các tính năng này mặc dù. – roberthl

+0

Nếu bạn chưa làm như vậy, có thể bạn nên mô tả trường hợp sử dụng của mình và đưa ra yêu cầu tính năng của bạn trên diễn đàn AWS CloudFormation chính thức (https://forums.aws.amazon.com/forum. jspa? forumID = 92). Tôi biết rằng nhóm phát triển xử lý sự hỗ trợ ở đó. –

+0

Tôi biết nó đã được một thời gian, nhưng tôi đã thực hiện điều này và gần đây [xuất bản nó trên GitHub] (https://github.com/royaloperahouse/stack-manager). AWS gần đây đã thêm logic và toán học cơ bản vào CloudFormation, nhưng nó khá cồng kềnh. – roberthl

5

Tôi gặp phải tình huống tương tự. Tôi muốn kiểm soát mọi thứ từ mẫu mà không tạo mẫu bằng cách sử dụng một số tập lệnh. Phạm vi đầu vào của tôi cũng bị giới hạn như trong trường hợp của bạn. Tôi đã kết thúc một cuộc tấn công khủng khiếp khủng khiếp. Tôi cảm thấy xấu hổ khi đăng nó ở đây nhưng nếu nó giúp thêm một người nữa, nó có thể đáng giá.

Có một bảng vẽ bản đồ mà sẽ làm phép tính cho bạn và xác định nó cho tất cả nguyên liệu đầu vào có thể

"Mappings" : { 
    "HorribleHackForSubtraction" : { 
     "1" : {"SubtractOne" : "0"}, 
     "2" : {"SubtractOne" : "1"}, 
     "3" : {"SubtractOne" : "2"}, 
     "4" : {"SubtractOne" : "3"}, 
     "5" : {"SubtractOne" : "4"}, 
     "6" : {"SubtractOne" : "5"}, 
     "7" : {"SubtractOne" : "6"}, 
     "8" : {"SubtractOne" : "7"}, 
     "9" : {"SubtractOne" : "8"}, 
     "10" : {"SubtractOne" : "9"}, 
     "11" : {"SubtractOne" : "10"}, 
     "12" : {"SubtractOne" : "11"}, 
     "13" : {"SubtractOne" : "12"}, 
     "14" : {"SubtractOne" : "13"}, 
     "15" : {"SubtractOne" : "14"}, 
     "16" : {"SubtractOne" : "15"}, 
    } 
}, 

Bạn có thể tham khảo giá trị tính toán như

{ "Fn::FindInMap" : [ "HorribleHackForSubtraction", { "Ref" : "MyInputParam"}, "SubtractOne" ] } 
Các vấn đề liên quan