Ich habe versucht, mithilfe der Troposphäre ein Tool zur Vorlagenerstellung für CloudFormation zu erstellen. Durch Ausführen des erstellten Tools auf Lambda habe ich versucht, eine Vorlage zu erstellen, indem ich das Parameterblatt auf S3 platziert habe.
Vor kurzem hatte ich die Möglichkeit, CloudFormation in meinem Unternehmen zu berühren. Ich denke, der Engpass bei der Verwendung von CloudFormation ist die Datei im JSON-Format.
python
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "hogehoge",
"Resources": {
"test1": {
"Properties": {
"CidrBlock": "10.1.0.0/16",
"EnableDnsHostnames": "true",
"EnableDnsSupport": "true",
"Tags": [
{
"Key": "Name",
"Value": "test1"
}
]
},
"Type": "AWS::EC2::VPC"
},
"test2": {
"Properties": {
"CidrBlock": "10.2.0.0/16",
"EnableDnsHostnames": "true",
"EnableDnsSupport": "true",
"Tags": [
{
"Key": "Name",
"Value": "test2"
}
]
},
"Type": "AWS::EC2::VPC"
}
}
}
Nur zwei VPCs herzustellen, sieht so aus. Ich denke, es ist eine ziemliche Handwerkskunst, dies von Hand zu schreiben.
troposphere ist ein Tool zum Erstellen einer solchen Datei im JSON-Format durch Schreiben in Python. https://github.com/cloudtools/troposphere Der obige Code kann auch wie folgt leicht lesbar geschrieben werden, indem er mit Tropical geschrieben wird.
python
import json
from troposphere import Tags,Template
from troposphere.ec2 import VPC
t = Template()
t.add_version("2010-09-09")
t.add_description("hogehoge")
t.add_resource(VPC(
"test1",
EnableDnsSupport="true",
CidrBlock="10.1.0.0/16",
EnableDnsHostnames="true",
Tags=Tags(
Name="test1"
)
))
t.add_resource(VPC(
"test1",
EnableDnsSupport="true",
CidrBlock="10.2.0.0/16",
EnableDnsHostnames="true",
Tags=Tags(
Name="test2"
)
))
json_template = t.to_json()
print(json_template)
Die grundlegende Verwendung besteht darin, den Versionsnamen und die Beschreibung mit add_version und add_description zu beschreiben und dann weitere Ressourcen hinzuzufügen, die mit add_resource erstellt werden sollen. Es ist nicht dramatisch einfacher zu lesen, aber ich denke, es ist ein bisschen besser als es im JSON-Format zu schreiben. Außerdem ist es nicht nur einfacher zu sehen, sondern der Punkt ist auch, dass Sie Python für und if-Anweisungen verwenden können. Es ist einfach, eine große Menge von Ressourcen zu beschreiben, indem mehrere CIDR-Blöcke und -Namen als Array übergeben werden.
python
import json
from troposphere import Tags,Template
from troposphere.ec2 import VPC
t = Template()
t.add_version("2010-09-09")
t.add_description("hogehoge")
VPC_CidrBlockList = ["10.1.0.0/16","10.2.0.0/16"]
VPC_TagsNameList = ["test1","test2"]
for (Address,Tag_Name) in zip(VPC_CidrBlockList,VPC_TagNameList):
t.add_resource(VPC(
Tag_Name,
EnableDnsSupport="true",
CidrBlock=Address,
EnableDnsHostnames="true",
Tags=Tags(
Name=Tag_Name
)
))
json_template = t.to_json()
print(json_template)
Im obigen Zustand werden übrigens die Einstellungswerte wie CIDR-Block und Name in das Skript geschrieben, dies ist jedoch schwierig zu verwenden. Lesen wir die Parameter von außen und speichern sie in einem Array, damit sie verwendet werden können. In diesem Fall sind zwei Arten von Informationen als Parameter erforderlich (CIDR-Block, Name). Erstellen Sie daher ein Parameterblatt wie unten gezeigt und speichern Sie es als Textdatei.
Öffnen und laden Sie nach dem Erstellen einer Textdatei zunächst diese Textdatei.
python
f = open('test.txt')
test = f.read()
f.close
Die Daten werden jetzt im Test gespeichert. In diesem Zustand sind jedoch die erste und die zweite Zeile nicht getrennt. Verwenden Sie also Splitlines, um jede Zeile als Array zu speichern.
python
test_list= test.splitlines()
Dadurch wird eine Array-Testliste mit jeder Zeile als Element erstellt. ["10.1.0.0/16,10.2.0.0/16","test1,test2"] Darüber hinaus wird hier die Aufteilung verwendet, um ein Array für jeden Parameter zu erstellen.
python
VPC_CidrBlockList = test_list[0].split(',')
VPC_TagNameList = test_list[1].split(',')
Jetzt haben Sie ein Array von Parametern erstellt. Wenn Sie diese Vorgänge einbinden und das vorherige Skript ändern, sieht es wie folgt aus.
python
import json
from troposphere import Tags,Template
from troposphere.ec2 import VPC
f = open('test.txt')
test = f.read()
f.close
test_list= test.splitlines()
VPC_CidrBlockList = test_list[0].split(',')
VPC_TagNameList = test_list[1].split(',')
t = Template()
t.add_version("2010-09-09")
t.add_description("hogehoge")
for (Address,Tag_Name) in zip(VPC_CidrBlockList,VPC_TagNameList):
t.add_resource(VPC(
Tag_Name,
EnableDnsSupport="true",
CidrBlock=Address,
EnableDnsHostnames="true",
Tags=Tags(
Name=Tag_Name
)
))
json_template = t.to_json()
print(json_template)
Sie können jetzt mehrere VPCs gemäß den im Parameterblatt aufgeführten Parametern erstellen.
Der grundlegende Teil der Verwendung von Lambda bleibt derselbe, aber der Prozess des Abrufens des Parameterblatts aus dem S3-Bucket und der Prozess des Hochladens der erstellten Vorlage in den S3-Bucket wurden hinzugefügt.
python
# coding: utf-8
import json
import urllib
import boto3
from troposphere import Tags,Template
from troposphere.ec2 import VPC
from datetime import datetime
basename = datetime.now().strftime("%Y%m%d-%H%M%S")
print('Loading function')
s3 = boto3.resource('s3')
def lambda_handler(event, context):
#print("Received event: " + json.dumps(event, indent=2))
# Get the object from the event and show its content type
bucket = event['Records'][0]['s3']['bucket']['name']
key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key']).decode('utf8')
print ("buket:" + bucket)
print ("key:" + key)
obj = s3.Object(bucket,key)
response= obj.get()
body = response['Body'].read()
body_list= body.splitlines()
# u'Erstellen einer VPC'
VPC_CidrBlockList = body_list[0].split(',')
VPC_TagNameList= body_list[1].split(',')
t = Template()
t.add_version("2010-09-09")
t.add_description("hogehoge")
for (Address,Tag_Name) in zip(VPC_CidrBlockList,VPC_TagNameList):
t.add_resource(VPC(
Tag_Name,
EnableDnsSupport="true",
CidrBlock=Address,
EnableDnsHostnames="true",
Tags=Tags(
Name=Tag_Name
)
))
json_template = t.to_json()
bucket = s3.Bucket('template_test')
obj = bucket.Object('json-template-' + basename + ' .txt')
response = obj.put(
Body=json_template.encode('utf-8'),
ContentEncoding='utf-8',
ContentType='text/plane'
)
print(json_template)
Sie können es auch flexibler festlegen, indem Sie die Elemente ändern, die als Variablen festgelegt werden sollen (z. B. "EnableDnsHostnames" in VPC). Wenn Sie andere Ressourcen auf diese Weise beschreiben, können Sie automatisch Vorlagen wie Subnetze und Sicherheitsgruppen sowie VPCs erstellen.
Recommended Posts