9

Próbuję ustawić certyfikat w mojej CloudFrontDistribution przy użyciu formacji Cloud.Jak zapewnić dystrybucję CloudFront za pomocą certyfikatu ACM za pomocą Formacji w chmurze

Mój certyfikat został wydany za pośrednictwem Menedżera certyfikatów. Zostało zatwierdzone i potwierdziłem, że certyfikat działa poprzez ręczną konfigurację bezpośrednio przez konsolę CloudFront.

ciągu mojego szablonu CloudFormation, starałem się używać zarówno Identifier i ARN wartości związanych z certyfikatem w obiekcie IamCertificateId:

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

Ale w obu przypadkach pojawia się następujący błąd:

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

Czytając dokumenty dotyczące DistributionConfig Complex Type wygląda nie jest właściwością „ACMCertificateArn”, ale to robi nie działa przez CloudFormation.

Każda pomoc zostanie doceniona.

+1

Możliwe, że cloudformation nie obsługuje acm dla CloudFront. Zazwyczaj występuje opóźnienie, dopóki chmura nie obsługuje nowych funkcji. – imperalix

+0

Podejrzewam, że tak jest. Smutny. –

+0

Być może możesz rozważyć oznaczenie mojej odpowiedzi, która zawiera zaktualizowane informacje jako poprawną odpowiedź. –

Odpowiedz

5

Cloudformation dodał tę właściwość, ale nie jest ona udokumentowana. Możesz z łatwością użyć tego:

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

Pamiętaj, że certyfikat musi być utworzony w regionie USA-wschód-1, jeśli nie, nie zostanie zaakceptowany.

+0

Miałem zamiar przetestować go najpierw :) –

+1

Dzisiaj zaktualizowali dokumentację, teraz możesz zobaczyć opcję: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-cloudfront-distributionconfig- viewercertificate.html –

+0

Hmm, nie działa, gdy używam ref do ARN:/ – tedder42

11

(Aktualizacja: Od Aug 9 2016, AWS CloudFormation obsługuje teraz ACM pomocą właściwości AcmCertificateArn, więc zwyczaj zasób opisany poniżej nie jest już potrzebna.)


Chociaż AWS :: :: CloudFront zasób Dystrybucja nie został zaktualizowany, aby obsługiwać właściwość ACMCertificateArn, ale obecnie można użyć funkcji custom CloudFormation resource do implementowania funkcji wymaganych przy użyciu interfejsu API AWS bezpośrednio do momentu zaktualizowania oficjalnego zasobu.

Zobacz stanowisko Ryana S. Browna, CloudFormation To Build A CDN With (Free) Custom SSL, w którym opisuje on swoją implementację zasobu Custom::CloudFrontAcmAssociation, który wiąże certyfikat ACM z dystrybucją CloudFront. Kod jest dostępny pod adresem ryansb/acm-certs-cloudformation.

Aby z niego skorzystać, należy udostępnić implementację zasobu CloudFormation za pomocą funkcji AWS Lambda. Realizacja Ryana jest już opublikowana do publicznej łyżką S3, więc można odwoływać się do tego bezpośrednio do celów testowych w szablonie CloudFormation tak:

"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 
    } 
}, 

Zasób Lambda::Function ma zależność IAM usługa roli i związane Politykę delegować niezbędne uprawnienia do funkcji lambda (odniesienie ExecRole wyżej), więc trzeba dodać, że zbyt:

"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"]} 
     } 
     ] 
    } 
    } 
}, 

Dzięki funkcji lambda w miejscu, w końcu dodać zasób Custom::CloudFrontAcmAssociation, zapewniając identyfikator dystrybucji, certyfikat ARN, i niestandardowy resourc ARN e lambda funkcyjnego:

"DistributionCertificateSetting": { 
    "Type": "Custom::CloudFrontAcmAssociation", 
    "Properties": { 
    "DistributionId": { 
     "Ref": "SiteCDN" 
    }, 
    "CertificateArn": { 
     "Ref": "AcmCertificate" 
    }, 
    "ServiceToken": { 
     "Fn::GetAtt": [ 
     "AcmAssociationFunction", 
     "Arn" 
     ] 
    } 
    } 
}, 

tldr: skopiuj cały powyższy kod w szablonie CloudFormation należy ustawić odpowiednie SiteCDN i AcmCertificate właściwości (lub edytować szablon z zakodowane wartości), i trzeba mieć własny zasób obejście, dopóki Amazon nie zaktualizuje oficjalnego zasobu CloudFront.

+0

Zadzwoń, dzięki –

+0

Zwróć uwagę na kilka ograniczeń tego podejścia: Po pierwsze, jeśli zmienisz jakiekolwiek właściwości oryginalnego zasobu CloudFront i zaktualizujesz swój stos CloudFormation, certyfikat ACM zostanie usunięty po aktualizacji, ponieważ podstawowy zasób CloudFormation ponownie zastosuje oryginalny config. Po drugie, podczas usuwania stosu może pojawić się błąd "Żądanie nie powiodło się, ponieważ nie spełniło warunków wstępnych w jednym lub większej liczbie pól nagłówka żądania" (ponieważ wydaje się, że podstawowy zasób CloudFormation używa starych danych 'IfMatch' i nie wie o zaktualizowanym ETag). – wjordan

-2

Zajęło kilka dni, ale znalazłem odpowiedź z pomocą wsparcia AWS.

Informacja dla:

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

zostanie znaleziony przy użyciu CLI "AWS IAM lista-server-certyfikaty":

{ 
    "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" 
}, 

Gdy odkryłem, że dodałem zmienną cloudfront.CloudFrontCertificateId z ServerCertificateId i wprowadzono go do ViewerCertificate:

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

Ta odpowiedź dotyczy sposobu korzystania z certyfikatu uzyskanego od zewnętrznego urzędu certyfikacji i przesłanego do magazynu certyfikatów IAM, ale powyższe pytanie zawiera pytanie o sposób korzystania z certyfikatu zarządzanego przez nową usługę menedżera certyfikatów AWS (AWS Certificate Manager). – wjordan

1

Miałem odpowiedni y utworzony certyfikat (klucz publiczny 2048 bitów), przesłany z pełnym łańcuchem. Trudniejsze było to, że certyfikat był używany bez problemów w innych usługach AWS (publicznych ELB).

Podałem również identyfikator certyfikatu (próbowałem również z ARN, ale jest to niepoprawne) poprawnie.

W moim przypadku problem polegał na tym, że certyfikat został utworzony za pomocą "path": "/". Po przesłaniu nowego certyfikatu (o innej nazwie) z "Path": "/ cloudfront /" wszystko działało bez problemu.

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/