Gibt es eine Möglichkeit, ein Root-Volume bei der Initialisierung über die Cloudformation-Vorlage zu kennzeichnen?
-
21-12-2019 - |
Frage
Ich erstelle eine Instanz über das Cloud-Formation-Skript.
Die einzige Möglichkeit, eine Betriebssystempartition anzuhängen, war die Eigenschaft „BlockDeviceMappings“.(Ich habe bereits zuvor versucht, die Eigenschaft „Volumes“ zu verwenden, aber die Instanz konnte nicht gemountet werden. Das System teilte mir mit, dass /dev/sda bereits zugeordnet war, und setzte die Instanzerstellung zurück.)
Hier ist der relevante Teil meiner Vorlage:
"Resources" :
{
"Ec2Instance" :
{
"Type" : "AWS::EC2::Instance",
"Properties" :
{
"BlockDeviceMappings" :
[{
"DeviceName" : "/dev/sda",
"Ebs" :
{
"VolumeSize" : { "Ref" : "RootVolumeSize" },
"SnapshotId" :
{ "Fn::FindInMap" : [ "RegionMap",
{ "Ref" : "AWS::Region" }, "RootVolumeSnapshotId" ]
}
}
}],
...
}
}
Meine Frage ist: Wie kann ich das Ebs-Volume, das ich hier erstelle, mit der Eigenschaft „BlockDeviceMappings“ kennzeichnen?Ich habe die offensichtliche Lösung nicht gefunden.
Danke.
Lösung
Konnte es über eine AWS CLI-Schnittstelle, eine IAM-Rolle und eine UserData-Initialisierung zum Laufen bringen.
Dies wurde hinzugefügt AWS::EC2::Instance:Properties:UserData
{ "Fn::Base64" : { "Fn::Join" : [ "\n", [
"#!/bin/bash",
"set -eux",
"exec > >(tee /tmp/user-data.log | logger -t user-data -s 2>/dev/console) 2>&1",
{ "Fn::Join" : [ "", [
"AWS_STACK_NAME='", { "Ref" : "AWS::StackName" }, "'"
]]},
{ "Fn::Join" : [ "", [
"AWS_ROOT_VOLUME_SNAPSHOT_ID='",
{ "Fn::FindInMap" :
[ "RegionMap", { "Ref" : "AWS::Region" }, "RootVolumeSnapshotId" ]},
"'"
]]},
"AWS_INSTANCE_ID=$( curl http://169.254.169.254/latest/meta-data/instance-id )",
"",
"AWS_HOME=/opt/aws",
"AWS_BIN_DIR=\"${AWS_HOME}/bin\"",
"export EC2_HOME=\"${AWS_HOME}/apitools/ec2\"",
"export JAVA_HOME=/etc/alternatives/jre_1.7.0",
"",
"ROOT_DISK_ID=$(",
" \"${AWS_BIN_DIR}/ec2-describe-volumes\" \\",
" --filter \"attachment.instance-id=${AWS_INSTANCE_ID}\" \\",
" --show-empty-fields \\",
" | grep '^VOLUME' \\",
" | awk '{printf \"%s,%s\\n\", $4, $2}' \\",
" | grep '^${AWS_ROOT_VOLUME_SNAPSHOT_ID}' \\",
" | cut --delimiter=, --fields=2",
" exit ${PIPESTATUS[0]}",
" )",
"\"${AWS_BIN_DIR}/ec2-create-tags \\",
" \"${ROOT_DISK_ID}\" \\",
" --tag \"Name=${AWS_STACK_NAME}-root\"",
""
]]}}
Außerdem muss ein Verweis auf eine IAM-Rolle hinzugefügt werden, die Volumes beschreiben und Tags erstellen kann.
Dies wurde zum Abschnitt „Ressourcen“ hinzugefügt:
"InstanceProfile" :
{
"Type" : "AWS::IAM::InstanceProfile",
"Properties" :
{
"Path" : "/",
"Roles" : [ "ec2-tag-instance" ]
}
}
Auf dieses Profil verwiesen im Instance
Ressource:
"Ec2Instance" :
{
"Type" : "AWS::EC2::Instance",
"Properties" :
{
...
"IamInstanceProfile" : {"Ref" : "InstanceProfile"},
...
}
}
Und in IAM
UI erstellt eine neue Rolle mit dem Namen ec2-tag-instance
, und weisen Sie diese Richtlinie zu:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:Describe*",
"ec2:CreateTags"
],
"Resource": "*"
}
]
}
Das heißt, es wäre viel schöner, wenn BlockDeviceMappings:Ebs
unterstützt hatte Tags
Element.
Andere Tipps
danke alex,
Ich fand heraus, dass es eine doppelte Anführungszeichen gibt, die nach
Außerdem, wenn die Instanzen nicht in der standardmäßigen US-Ost-1-Region wohnhaft sind, geben Sie auch in den
Wenn Ihr CloudForation-Stack markiert ist und Sie möchten, dass Ihre EC2-Beilagen, um die Tags aus dem Stapel zu kopieren, können Sie den untenstehenden UserData-Wert verwenden.
generasacodicetagpre.- .
-
Schreiben Sie alle stdout und stderr in die Datei zum Debugging:
`exec> /tmp/part-001.log 2> & 1
-
(erfordert Erlaubnis) Holen Sie sich die Tags aus dem Stapel:
TAGS=$(aws cloudformation describe-stacks --stack-name ${AWS::StackName} --query 'Stacks[0].Tags' --region ${AWS::Region})
-
Holen Sie sich die EC2-Instanz-ID aus dem Metadatenendpunkt:
EC2_INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
-
(erfordert Erlaubnis) Holen Sie sich die EBS-IDs:
EBS_IDS=$(aws ec2 describe-volumes --filters Name=attachment.instance-id,Values="$EC2_INSTANCE_ID" --region ${AWS::Region} --query 'Volumes[*].[VolumeId]' --out text | tr "\n" " ")
-
(erfordert Erlaubnis) Fügen Sie den EBS-Volumes Tags hinzu:
aws ec2 create-tags --resources $EBS_IDS --tags "$TAGS" --region ${AWS::Region}
-
Format-Tags für ECS-Tagging:
TAGS=$(echo $TAGS | tr "Key" "key" | tr "Value" "value")
-
(erfordert Erlaubnis) Markieren Sie den ECS-Cluster:
aws ecs tag-resource --resource-arn arn:aws:ecs:${AWS::Region}:${AWS::AccountId}:cluster/${EcsClusterName} --tags "$TAGS"
Die Richtlinie sollte so aussehen:
generasacodicetagpre.Sie können die CloudFormation-Vorlage verwenden, um Ressourcen wie Cloudwatch-Ereignisregel und Lambda zu erstellen.Der Lambda-Aufruf kann nicht nur ausgelöst werden, wenn ein Instanz-Erstellungs-Ereignis vorliegt, sondern wenn Updates mit Instanz-Tags passieren.
Das habe ich in meiner EC2-UserData getan.Ich denke, es ist viel einfacher als die Antwort.
generasacodicetagpre.