0

J'essaye de déployer ma fonction lambda à chaque fois que je s3 seau contenant des mises à jour.Comment utiliser lamda pour déployer le dernier code mis en s3 à la fonction lamda

Si je sais que j'ai le le dernier code lambda zip dans un seau, je peux simplement utiliser la formation de nuages ​​pour automatiser la création et le déploiement de la fonction lambda

{ 
"AWSTemplateFormatVersion": "2010-09-09", 
"Description": "AWS CloudFormation CloudWatch Log Janitor Demo Stack", 
"Resources": { 
    "TestLamdaRole": { 
     "Type": "AWS::IAM::Role", 
     "Properties": { 
      "AssumeRolePolicyDocument": { 
       "Version": "2012-10-17", 
       "Statement": [{ 
        "Effect": "Allow", 
        "Principal": { 
         "Service": [ 
          "lambda.amazonaws.com" 
         ] 
        }, 
        "Action": [ 
         "sts:AssumeRole" 
        ] 
       }] 
      }, 
      "Path": "/" 
     } 
    }, 
    "EbsBackupExecutionPolicy": { 
     "DependsOn": [ 
      "TestLamdaRole" 
     ], 
     "Type": "AWS::IAM::Policy", 
     "Properties": { 
      "PolicyName": "hamedlamdapolicytest", 
      "Roles": [{ 
       "Ref": "TestLamdaRole" 
      }], 
      "PolicyDocument": { 
       "Version": "2012-10-17", 
       "Statement": [{ 
         "Effect": "Allow", 
         "Action": [ 
          "logs:*" 
         ], 
         "Resource": [ 
          "arn:aws:lambda:us-east-1:1111111111111:function:*" 
         ] 
        }, 
        { 
         "Effect": "Allow", 
         "Action": [ 
          "ec2:Describe*" 
         ], 
         "Resource": [ 
          "*" 
         ] 
        } 
       ] 
      } 
     } 
    }, 
    "LambdaFuction": { 
     "Type": "AWS::Lambda::Function", 
     "Properties": { 
      "Code": { 
       "S3Bucket": "lambda-dep-test", 
       "S3Key": "index.zip" 
      }, 
      "Role": { 
       "Fn::GetAtt": [ 
        "TestLamdaRole", 
        "Arn" 
       ] 
      }, 
      "Timeout": 60, 
      "Handler": "lambda_function.handler", 
      "Runtime": "nodejs6.10", 
      "MemorySize": 128, 
      "FunctionName": "stg1-test" 
     } 
    } 
} 

}

Mais le problème est que dès que je lance le code lambda ci-dessus, chaque fois que l'utilisateur met sth dans le seau, le dernier code ne se déploie pas automatiquement. Je sais que ça a un rapport avec lambda mais je suis perdu et je ne sais pas quelle approche utiliser et par où commencer. Pouvez-vous s'il vous plaît éclaircir cela?

+1

Il n'y a pas de moyen simple d'y parvenir. Créez un événement dans S3. Chaque fois qu'un nouveau fichier est ajouté, l'événement déclenchera une fonction Lambda différente qui mettra à jour la fonction d'origine (dans ce cas: stg1-test) –

Répondre

1

Vous pouvez également utiliser des structures telles que sans serveur. Ils facilitent le déploiement en utilisant des commandes simples et faciles à intégrer à votre CI. https://serverless.com

+0

Merci de bien connaître ce framework. mais ce que je veux, c'est un déploiement automatique sans intrusion de l'utilisateur. Est-ce que le cadre fait cela? –

+0

Serverless déploie le fichier zip sur le compartiment s3 configuré et déclenche le déploiement lambda. Dans votre cas, vous aurez toujours besoin de l'interaction de l'utilisateur pour télécharger le fichier zip sur s3. –

1

Voilà comment j'abordé cette question:

  • Activer versioning dans le seau lambda-dep-test
  • Dans votre déclaration AWS::Lambda::Function dans votre CloudFormation modèle, utilisez la propriété S3ObjectVersion dans la section Code pour spécifier la version devrait être déployée.

Maintenant, vous pouvez mettre à jour le modèle et spécifiez une nouvelle S3ObjectVersion chaque fois que le code lambda est mis à jour dans le seau ou vous pouvez le déclarer comme paramètre dans votre modèle et la référence dans S3ObjectVersion. Les deux solutions peuvent ensuite être scriptées avec l'empaquetage et le chargement de votre fichier .zip.