9

Sto tentando di impostare un certificato nella mia CloudFrontDistribution utilizzando Cloud Formation.Come eseguire il provisioning di una distribuzione CloudFront con un certificato ACM tramite Cloud Formation

Il mio certificato è stato emesso tramite Gestione certificati. È stato approvato e ho convalidato che il certificato funziona tramite la configurazione manuale direttamente attraverso la console CloudFront.

Entro mio modello CloudFormation, ho cercato di utilizzare sia il Identifier e ARN valori associati con il certificato nella proprietà IamCertificateId:

"ViewerCertificate" : { 
    "IamCertificateId" : "********", 
    "SslSupportMethod": "sni-only" 
} 

Ma in entrambi i casi che ricevo il seguente errore:

The specified SSL certificate doesn't exist, isn't valid, or doesn't include a valid certificate chain. 

Leggendo la documentazione per l'DistributionConfig Complex Type sembra che ci sia una proprietà 'ACMCertificateArn', ma questo fa non sembra funzionare tramite CloudFormation.

Qualsiasi aiuto sarebbe apprezzato.

+1

Probabilmente il fatto che cloud non supporta ancora acm per CloudFront. Di solito c'è un ritardo fino a quando cloudformation supporta nuove funzionalità. – imperalix

+0

Sospetto che sia così. Triste. –

+0

Forse potresti considerare di contrassegnare la mia risposta che include le informazioni aggiornate come risposta corretta. –

risposta

5

Cloudformation ha aggiunto questa proprietà ma non è documentata. È possibile utilizzare in questo modo facilmente:

"ViewerCertificate": { 
      "SslSupportMethod": "sni-only", 
      "AcmCertificateArn": "CERTIFICATE_ARN" 
} 

essere consapevoli che il certificato deve essere creato in noi-est-1 regione, se non che non sarà accettata.

+0

Stavo per testarlo prima :) –

+1

Oggi hanno aggiornato la documentazione, ora puoi vedere l'opzione: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distributionconfig- viewercertificate.html –

+0

Hmm, non funziona quando uso un riferimento all'ARN:/ – tedder42

11

(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.

+0

Incredibile, grazie –

+0

Nota alcune limitazioni a questo approccio: in primo luogo, se si modificano le proprietà sulla risorsa CloudFront originale e si aggiorna lo stack CloudFormation, il certificato ACM verrà rimosso dopo l'aggiornamento, poiché la risorsa CloudFormation di base riapplica l'originale config. In secondo luogo, quando si cancella lo stack potresti ricevere un errore "La richiesta non è riuscita perché non ha soddisfatto le precondizioni in uno o più campi di intestazione della richiesta" (poiché sembra che la risorsa CloudFormation di base utilizzi vecchi dati "IfMatch" e non sia a conoscenza sull'ETag aggiornato). – wjordan

-2

Ci sono voluti alcuni giorni ma ho trovato la risposta con l'aiuto del supporto di AWS.

Le informazioni per:

"ViewerCertificate" : { 
    "IamCertificateId" : "********", 
    "SslSupportMethod": "sni-only" 
} 

viene trovato utilizzando la CLI "AWS iam list-server-certificati":

{ 
    "ServerCertificateId": "ASCAXXXXXXXXXXXXXX", 
    "ServerCertificateName": "devops.XXXXXXX.com", 
    "Expiration": "2017-03-10T15:00:33Z", 
    "Path": "/cloudfront/", 
    "Arn": "arn:aws:iam::XXXXXXXXXXX:server-certificate/cloudfront/devops.XXXXXXXXXXX.com", 
    "UploadDate": "2016-03-14T16:13:59Z" 
}, 

Una volta ho scoperto che ho aggiunto un cloudfront.CloudFrontCertificateId variabile con il ServerCertificateId e alimentato nel ViewerCertificate:

"ViewerCertificate" : { 
    "IamCertificateId" : {{ cloudfront.CloudFrontCertificateId }}, 
    "SslSupportMethod": "sni-only" 
} 
+4

Questa risposta spiega come utilizzare un certificato ottenuto da un'autorità di certificazione di terze parti e caricato nell'archivio certificati IAM, ma la domanda precedente chiedeva come utilizzare un certificato gestito dal nuovo servizio AWS Certificate Manager (ACM). – wjordan

1

Ho avuto una corretta y certificato creato (chiave pubblica 2048 bit), caricato con l'intera catena. La cosa più difficile era che il certificato veniva usato senza problemi in altri servizi AWS (ELB pubblico).

Stavo anche passando l'ID del certificato (avevo anche provato con ARN ma non è corretto) correttamente.

Nel mio caso, il problema era che il certificato era stato creato con un "percorso": "/". Dopo aver caricato un nuovo certificato (con un nome diverso) con "Percorso": "/ cloudfront /", tutto ha funzionato senza problemi.

aws iam upload-server-certificate \ 
    --server-certificate-name cert_cf \ 
    --certificate-body file://cert.crt \ 
    --private-key file://cert.key \ 
    --certificate-chain file://chain.pem \ 
    --path /cloudfront/ 
Problemi correlati