private async Task<CloudFrontSetting> CreateCloudFrontDistributionAsync(string bucketName, bool shouldCache = true)
{
using (
var client = new AmazonCloudFrontClient(cfConfigurationProvider.AccessKey,
cfConfigurationProvider.SecretKey, cfConfigurationProvider.RegionEndpoint))
{
var originId = $"S3-{bucketName}";
var distrubtions = await client.ListDistributionsAsync();
var existingDist =
distrubtions.DistributionList.Items.SingleOrDefault(
summary => summary.Origins.Items.Any(origin => origin.Id == originId));
if (existingDist != null)
{
return new CloudFrontSetting {BucketName = bucketName, DomainName = existingDist.DomainName};
}
var distributionConfig = new DistributionConfig
{
CallerReference = bucketName,
Enabled = true,
Comment = string.Empty,
Origins = new Origins
{
Items =
{
new Origin
{
Id = originId,
DomainName =
string.Format("{0}.s3.amazonaws.com", bucketName),
S3OriginConfig = new S3OriginConfig {OriginAccessIdentity = string.Empty}
}
},
Quantity = 1
},
DefaultCacheBehavior = new DefaultCacheBehavior
{
AllowedMethods = new AllowedMethods {Items = {"HEAD", "GET"}, Quantity = 2},
ForwardedValues =
new ForwardedValues
{
Headers =
new Headers
{
Items =
{
"Access-Control-Request-Headers",
"Access-Control-Request-Method",
"Origin"
},
Quantity = 3
},
QueryString = true,
Cookies = new CookiePreference {Forward = new ItemSelection("none")}
},
TrustedSigners = new TrustedSigners {Enabled = false, Quantity = 0},
MinTTL = 0,
MaxTTL = 31536000,
DefaultTTL = shouldCache ? 86400 : 0,
TargetOriginId = string.Format("S3-{0}", bucketName),
ViewerProtocolPolicy = new ViewerProtocolPolicy("allow-all"),
},
PriceClass = PriceClass.PriceClass_All
};
var request = new CreateDistributionRequest(distributionConfig);
var response = await client.CreateDistributionAsync(request);
return new CloudFrontSetting
{
BucketName = response.Distribution.DistributionConfig.CallerReference,
DomainName = response.Distribution.DomainName
};
}
}