0

Tentative d'automatisation du déploiement d'un site Web statique à l'aide de boto3. J'ai un site Web statique (angular/javascript/html) assis dans un seau, et j'ai besoin d'utiliser le CDN aws cloudfront. Quoi qu'il en soit, cela ressemble à faire le seau s3 et la copie dans le html/js fonctionne très bien.Déploiement d'un site statique avec s3 et cloudfront à l'aide de python boto3

import boto3 
cf = boto3.client('cloudfront') 

cf.create_distribution(DistributionConfig=dict(CallerReference='firstOne', 
      Aliases = dict(Quantity=1, Items=['mydomain.com']), 
      DefaultRootObject='index.html', 
      Comment='Test distribution', 
      Enabled=True, 
      Origins = dict(
       Quantity = 1, 
       Items = [dict(
        Id = '1', 
        DomainName='mydomain.com.s3.amazonaws.com') 
       ]), 
      DefaultCacheBehavior = dict(
       TargetOriginId = '1', 
       ViewerProtocolPolicy= 'redirect-to-https', 
       TrustedSigners = dict(Quantity=0, Enabled=False), 
       ForwardedValues=dict(
        Cookies = {'Forward':'all'}, 
        Headers = dict(Quantity=0), 
        QueryString=False, 
        QueryStringCacheKeys= dict(Quantity=0), 
        ), 
       MinTTL=1000) 
      ) 
) 

Lorsque je tente de créer la distribution CloudFront, je reçois l'erreur suivante:

InvalidOrigin: An error occurred (InvalidOrigin) when calling the CreateDistribution operation: The specified origin server does not exist or is not valid. An error occurred (InvalidOrigin) when calling the CreateDistribution operation: The specified origin server does not exist or is not valid.

Fait intéressant, il semble se plaindre de l'origine, mydomain.com.s3.amazonaws.com, Toutefois, lorsque je crée une distribution pour le compartiment s3 dans la console Web, il n'y a aucun problème avec le même nom de domaine d'origine.

Mise à jour: je peux obtenir ce travail avec Boto avec ce qui suit, mais préférez utiliser boto3:

import boto 
c = boto.connect_cloudfront() 
origin = boto.cloudfront.origin.S3Origin('mydomain.com.s3.amazonaws.com') 
distro = c.create_distribution(origin=origin, enabled=False, comment='My new Distribution') 
+0

hmmm ... le domaine mydomain.com ne devrait-il pas être le nom du compartiment? ne pense pas que les points sont autorisés dans les noms de seau ...? – gsaslis

+0

Les points et les tirets sont autorisés. J'ai essayé un nom de seau sans '.' caractères bien, et j'ai eu la même erreur. Littéralement en utilisant la même chaîne de noms de domaine d'origine dans la console Web aws fonctionne. – Atifm

+0

Existe-t-il cependant? Je veux dire .. le domaine que vous utilisez est-il réellement valide? – gsaslis

Répondre

0

Transforme leur est un paramètre obligatoire n'a pas été documenté correctement.

Étant donné que Origin est un compartiment S3, vous devez définir S3OriginConfig = dict (OriginAccessIdentity = '') même si OriginAccessIdentity n'est pas utilisé et qu'il s'agit d'une chaîne vide.

La commande suivante fonctionne. Notez que vous avez toujours besoin d'une stratégie de compartiment pour rendre les objets accessibles, et d'une entrée route53 pour aliaser le nom de c que nous voulons mettre en nuage sur le nom d'hôte généré.

cf.create_distribution(DistributionConfig=dict(CallerReference='firstOne', 
      Aliases = dict(Quantity=1, Items=['mydomain.com']), 
      DefaultRootObject='index.html', 
      Comment='Test distribution', 
      Enabled=True, 
      Origins = dict(
       Quantity = 1, 
       Items = [dict(
        Id = '1', 
        DomainName='mydomain.com.s3.amazonaws.com', 
        S3OriginConfig = dict(OriginAccessIdentity = '')) 
       ]), 
      DefaultCacheBehavior = dict(
       TargetOriginId = '1', 
       ViewerProtocolPolicy= 'redirect-to-https', 
       TrustedSigners = dict(Quantity=0, Enabled=False), 
       ForwardedValues=dict(
        Cookies = {'Forward':'all'}, 
        Headers = dict(Quantity=0), 
        QueryString=False, 
        QueryStringCacheKeys= dict(Quantity=0), 
        ), 
       MinTTL=1000) 
      ) 
)