AWS - формирование облаков Script для создания ведра S3 и распределения
Я работаю над созданием AWS для ведра и дистрибутива с помощью скриптов. Я создал script и запустил шаблон стека script в консоли формирования облаков AWS.
Я создаю bucketpolicy для ведра S3 с помощью script и канонического идентификатора. Как только я создаю политику ведра, я хочу динамически назначать его "OriginAccessIdentity" в script. Я хочу добавить идентификатор, созданный из политики ведра, в атрибуты "OriginAccessIdentity".
Как достичь этой функциональности?
Script:
{
"AWSTemplateFormatVersion" : "2010-09-09",
"Description" : "AWS CloudFormation Template S3_With_CloudFront_Distribution",
"Parameters" : {
"bucketname" : {
"Type" : "String",
"Description" : "test"
},
"cannonicalid" : {
"Type" : "String",
"Description" : "234213523145314534523452345234523452345"
}
},
"Conditions" : {
"CreateProdResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "dev"]}
},
"Resources" : {
"testbucket" : {
"Type" : "AWS::S3::Bucket",
"Properties" : {
"BucketName" : { "Ref" : "bucketname" },
"WebsiteConfiguration" : {
"IndexDocument" : "index.html"
}
}
},
"mybucketpolicy" : {
"Type" : "AWS::S3::BucketPolicy",
"Properties" : {
"PolicyDocument" : {
"Id" : "MyPolicy",
"Statement" : [ {
"Sid" : "Grant a CloudFront Origin Identity access to support private content",
"Action" : [ "s3:GetObject" ],
"Effect" : "Allow",
"Resource" : { "Fn::Join" : [
"", [ "arn:aws:s3:::", { "Ref" : "testbucket" } , "/*" ]
] },
"Principal" : {
"CanonicalUser":{ "Ref" : "cannonicalid" }
}
} ]
},
"Bucket" : { "Ref" : "testbucket" }
}
},
"testdistribution" : {
"Type" : "AWS::CloudFront::Distribution",
"Properties" : {
"DistributionConfig" : {
"Origins" : [ {
"Id" : "S3Origin",
"DomainName" : { "Fn::GetAtt" : [ "testbucket", "DomainName" ] },
"S3OriginConfig" : {
"OriginAccessIdentity" : "How to configure the id dynamically here"
}
}
],
"Enabled" : "true",
"Comment" : "",
"DefaultRootObject" : "index.html",
"Aliases" : [ "test.com" ],
"CacheBehaviors" : [ {
"TargetOriginId" : "S3Origin",
"ForwardedValues" : {
"QueryString" : "false"
},
"ViewerProtocolPolicy" : "allow-all",
"MinTTL" : "1",
"PathPattern" : "resources/*.json"
}
],
"DefaultCacheBehavior" : {
"TargetOriginId" : "S3Origin",
"ForwardedValues" : {
"QueryString" : "false"
},
"ViewerProtocolPolicy" : "allow-all",
"MinTTL" : "1"
}
}
}
}
},
"Outputs" : {
"DistributionId" : {
"Description" : "CloudFront Distribution Id",
"Value" : { "Ref" : "testdistribution" }
},
"DistributionName" : {
"Description" : "URL to access the CloudFront distribution",
"Value" : { "Fn::Join" : [ "", ["http://", {"Fn::GetAtt" : ["testdistribution", "DomainName"]} ]]}
},
"S3OriginDNSName" : {
"Description" : "Name of S3 bucket to hold website content.",
"Value" : { "Fn::GetAtt" : [ "testbucket", "DomainName"] }
}
}
}
Ответы
Ответ 1
Идентификатор доступа к происхождению не может быть создан с помощью CloudFormation. Единственным ресурсом CloudFront, доступным через Cloudformation, является ресурс AWS:: CloudFront:: Distribution.
Вы можете избежать жесткого кодирования ссылки на OAI в своем шаблоне, используя параметр для передачи в существующем OAI при создании вашего стека. Затем вы можете использовать этот параметр как значение для OriginAccessIdentity
в типе S3Origin
, связанном с ключом S3OriginConfig
.
Это не идеально, но это позволяет сделать ваши шаблоны более универсальными.
Ответ 2
С 2 ноября 2017 года CloudFormation поддерживает это с использованием ресурса AWS:: CloudFront:: CloudFrontOriginAccessIdentity.
С ресурсом идентификации доступа источника, определенным как:
"OriginAccessId": {
"Type": "AWS::CloudFront::CloudFrontOriginAccessIdentity",
"Properties": {
"CloudFrontOriginAccessIdentityConfig": {
"Comment": "MyDescription"
}
}
}
вы можете ссылаться на него в конфигурации распространения:
"OriginAccessIdentity" : {
"Fn::Sub": "origin-access-identity/cloudfront/${OriginAccessId}"
}