CloudFormation 템플릿에서 초기화 할 때 루트 볼륨에 태그를 지정하는 방법이 있습니까?
-
21-12-2019 - |
문제
클라우드 형성 스크립트를 통해 인스턴스를 만드는 중입니다.
OS 파티션을 첨부하는 유일한 방법은 "BLOCKDEVICEMAPPINSING"속성을 통해 이루어졌습니다.(전에는 "볼륨"속성을 사용하려고 노력했지만 인스턴스를 탑재 할 수 없었습니다. 시스템은 / dev / sda가 이미 맵핑되고 인스턴스 생성을 다시 롤백 함을 알려줍니다)
여기서는 내 템플릿의 관련 부분입니다.
"Resources" :
{
"Ec2Instance" :
{
"Type" : "AWS::EC2::Instance",
"Properties" :
{
"BlockDeviceMappings" :
[{
"DeviceName" : "/dev/sda",
"Ebs" :
{
"VolumeSize" : { "Ref" : "RootVolumeSize" },
"SnapshotId" :
{ "Fn::FindInMap" : [ "RegionMap",
{ "Ref" : "AWS::Region" }, "RootVolumeSnapshotId" ]
}
}
}],
...
}
}
.
내 질문은 "BlockDevicEmappings"속성으로 여기에서 생성하고있는 EBS 볼륨에 태그를 찍을 수 있습니까?나는 분명한 해결책을 찾지 못했습니다.
감사합니다.
해결책
는 AWS CLI 인터페이스, IAM 역할 및 userData 초기화를 통해 작업 할 수있었습니다.
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\"",
""
]]}}
.
에는 볼륨 및 생성 태그를 설명 할 수있는 IAM 역할에 대한 참조를 추가해야합니다.
이를 "자원"섹션에 추가 :
"InstanceProfile" :
{
"Type" : "AWS::IAM::InstanceProfile",
"Properties" :
{
"Path" : "/",
"Roles" : [ "ec2-tag-instance" ]
}
}
.
는 Instance
자원 에서이 프로파일을 참조합니다.
"Ec2Instance" :
{
"Type" : "AWS::EC2::Instance",
"Properties" :
{
...
"IamInstanceProfile" : {"Ref" : "InstanceProfile"},
...
}
}
.
및 IAM
UI는 ec2-tag-instance
라는 새 역할을 만들고이 정책을 할당합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:Describe*",
"ec2:CreateTags"
],
"Resource": "*"
}
]
}
.
BlockDeviceMappings:Ebs
가 Tags
요소를 지원했을 경우 훨씬 더 좋은 것입니다.
다른 팁
감사합니다 Alex,
ec2-create-tags :)
다음에 누락 된 큰 따옴표가 없습니다. "\"${AWS_BIN_DIR}/ec2-create-tags\" \\",
" \"${ROOT_DISK_ID}\" \\",
" --tag \"Name=${AWS_STACK_NAME}-root\"",
.
인스턴스가 기본 US-EAST-1 지역에 거주하지 않으면 ec2-create-tags - region region "을 지정하십시오.> 및 ec2-descript-volumes 명령.
CloudFormation 스택이 태그가 있고 EC2 첨부 된 볼륨이 스택에서 태그를 복사하려면 아래 UserData 값을 사용할 수 있습니다.
Fn::Base64: !Sub |
#!/bin/bash -xe
exec > /tmp/part-001.log 2>&1
# --==Tagging Attached Volumes==--
TAGS=$(aws cloudformation describe-stacks --stack-name ${AWS::StackName} --query 'Stacks[0].Tags' --region ${AWS::Region})
EC2_INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
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" " ")
aws ec2 create-tags --resources $EBS_IDS --tags "$TAGS" --region ${AWS::Region}
TAGS=$(echo $TAGS | tr "Key" "key" | tr "Value" "value")
aws ecs tag-resource --resource-arn arn:aws:ecs:${AWS::Region}:${AWS::AccountId}:cluster/${EcsClusterName} --tags "$TAGS"
.
-
모든 stdout 및 stderr을 디버깅을위한 파일에 씁니다 :
`exec> /tmp/part-001.log 2> & 1
-
(사용 권한 필요) 스택에서 태그를 가져옵니다.
TAGS=$(aws cloudformation describe-stacks --stack-name ${AWS::StackName} --query 'Stacks[0].Tags' --region ${AWS::Region})
-
메타 데이터 엔드 포인트에서 EC2 인스턴스 ID 가져 오기 :
EC2_INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
-
(권한 필요) EBS ID를 가져 오십시오 :
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" " ")
-
(사용 권한 필요) 태그를 EBS 볼륨에 추가하십시오.
aws ec2 create-tags --resources $EBS_IDS --tags "$TAGS" --region ${AWS::Region}
-
ECS 태깅을위한 태그 형식 태그 :
TAGS=$(echo $TAGS | tr "Key" "key" | tr "Value" "value")
-
(권한 필요) ECS 클러스터 태그 :
aws ecs tag-resource --resource-arn arn:aws:ecs:${AWS::Region}:${AWS::AccountId}:cluster/${EcsClusterName} --tags "$TAGS"
정책은 다음과 같아야합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"ec2:DeleteTags",
"ec2:CreateTags",
"ecs:TagResource",
"cloudformation:DescribeStacks"
],
"Resource": "*"
}
]
}
.CloudFormation 템플리트를 사용하여 CloudWatch 이벤트 규칙 및 Lambda와 같은 자원을 만듭니다.람다 호출은 인스턴스 작성 이벤트가 있지만 인스턴스 태그로 업데이트가 발생할 때뿐만 아니라 업데이트가 발생할 수 있습니다.
이것은 내 EC2 userData에서 내가 한 일입니다.나는 그것이 위의 답변보다 훨씬 간단하다고 생각합니다.
Key=<Your Tag Name>
Value=<Your Tag Value>
Region=$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | grep -oP "(?<=\"region\" : \")[^\"]+")
aws ec2 create-tags --resources $(aws ec2 describe-instances --instance-ids $(curl -s http://169.254.169.254/latest/meta-data/instance-id) --region $Region | grep -oP "(?<=\"VolumeId\": \")[^\"]+") --tags Key=$Key,Value=$Value --region $Region
.