(Aggiornamento: Come di Aug 9 2016, AWS CloudFormation ora supporta ACM utilizzando la proprietà AcmCertificateArn
, quindi la risorsa personalizzata descritto di seguito non è più necessario.)
Anche se l'AWS :: :: CloudFront risorsa Distribution non è stato ancora aggiornato per supportare la proprietà ACMCertificateArn, al momento è possibile utilizzare uno custom CloudFormation resource per implementare la funzionalità necessaria utilizzando l'API AWS direttamente fino all'aggiornamento della risorsa ufficiale.
Vedere il post di Ryan S. Brown, CloudFormation To Build A CDN With (Free) Custom SSL dove descrive la sua implementazione di una risorsa Custom::CloudFrontAcmAssociation
che associa un certificato ACM a una distribuzione CloudFront. Il codice è disponibile allo ryansb/acm-certs-cloudformation
.
Per utilizzarlo, è necessario rendere disponibile l'implementazione della risorsa CloudFormation tramite una funzione AWS Lambda. implementazione di Ryan è già pubblicato in un secchio pubblico S3, in modo da poter fare riferimento a questo direttamente a scopo di test nel modello CloudFormation in questo modo:
"AcmAssociationFunction": {
"Type": "AWS::Lambda::Function",
"Properties": {
"Handler": "cloudfront_associator.handler",
"MemorySize": 128,
"Runtime": "python2.7",
"Code": {
"S3Bucket": "demos.serverlesscode.com",
"S3Key": "acm-certificate-resource-functions.zip"
},
"Role": {"Fn::GetAtt": ["ExecRole", "Arn"]},
"Timeout": 300
}
},
La risorsa Lambda::Function
ha una dipendenza su un ruolo di servizio IAM ed associato politica di delegare le autorizzazioni necessarie alla funzione lambda (il riferimento ExecRole
sopra), quindi è necessario aggiungere anche questo:
"ExecRolePolicies": {
"Type": "AWS::IAM::Policy",
"Properties": {
"PolicyName": "ExecRolePolicy",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"acm:*",
"cloudfront:List*",
"cloudfront:Get*",
"cloudfront:UpdateDistribution"
],
"Resource": [ "*" ],
"Effect": "Allow"
},
{
"Action": [ "logs:*" ],
"Resource": "arn:aws:logs:*:*:*",
"Effect": "Allow"
}
]
},
"Roles": [{"Ref": "ExecRole"}]
}
},
"ExecRole": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": ["sts:AssumeRole"],
"Effect": "Allow",
"Principal": {"Service": ["lambda.amazonaws.com"]}
}
]
}
}
},
Con la funzione lambda a posto, infine, aggiungere la risorsa Custom::CloudFrontAcmAssociation
, fornendo l'ID di distribuzione, certificato di ARN, e la risorsa personalizzata ARN di funzione lambda e:
"DistributionCertificateSetting": {
"Type": "Custom::CloudFrontAcmAssociation",
"Properties": {
"DistributionId": {
"Ref": "SiteCDN"
},
"CertificateArn": {
"Ref": "AcmCertificate"
},
"ServiceToken": {
"Fn::GetAtt": [
"AcmAssociationFunction",
"Arn"
]
}
}
},
TLDR: copiare tutto il codice precedente nel tuo modello CloudFormation, impostare le opportune SiteCDN
e AcmCertificate
proprietà (o modificare il modello con i valori hard-coded), e si dovrebbe avere una risorsa personalizzata soluzione alternativa finché Amazon aggiorna la risorsa CloudFront ufficiale.
Probabilmente il fatto che cloud non supporta ancora acm per CloudFront. Di solito c'è un ritardo fino a quando cloudformation supporta nuove funzionalità. – imperalix
Sospetto che sia così. Triste. –
Forse potresti considerare di contrassegnare la mia risposta che include le informazioni aggiornate come risposta corretta. –