Dans cette article, nous allons créer une fonction lambda en java, et l'intégrer à la pipeline de déploiement.
Voir aussi :
Table of contents generated with markdown-toc
Cet article fait suite à la [partie 2][https://joseph-mbimbi.fr/blog/serverless-cicd-demo-2].
Le code est disponible à l'url suivante: https://github.com/mbimbij/aws-serverless-cicd-demo
Dans celui-ci, nous allons :
Ceci correspondant aux étapes 2 et 3 de l'implémentation de la pipeline.
Pour rappel, voici le résultat final que l'on souhaite obtenir:

Les étapes que l'on avait défini pour y arriver:

Nous allons découper cette étape en 2 sous-étapes:
Nous avons besoin d'introduire une clé KMS custom car CodePipeline utilise le "server side encryption" (SSE) pour stocker les artefacts dans le bucket S3 dédié.
Pour un déploiement cross-account, nous avons besoin d'introduire un rôle dans le compte cible, et ce rôle va récupérer les artefacts dans le bucket du compte d'origine.
Or, par défaut, CodePipeline utilise SSE-KMS avec une clé par défaut managée par AWS, dont on ne peut pas modifier la policy, ainsi le rôle du compte cible ne peut pas utiliser la clé et ne peut pas récupérer les artefacts et on se prendrait des http 403 "access denied" lors du déploiement.
Nous avons donc besoin d'introduire une clé custom, avec une policy permettant au rôle du compte cible d'y accéder
step1.3.3_pre-traffic-hook-integration-teststep2.1_introduce-custom-kms-keyOn introduit une clé KMS dans le code CloudFormation de la pipeline.
On modifie aussi les projets CodeBuild et CodePipeline pour utiliser cette clé
KmsKey:
Type: AWS::KMS::Key
Properties:
Description: A KMS key to enable cross account deployments
KeyPolicy:
Version: '2012-10-17'
Id: key-default-1
Statement:
- Sid: Enable IAM User Permissions
Effect: Allow
Principal:
AWS: !Sub 'arn:aws:iam::${AWS::AccountId}:root'
Action: kms:*
Resource: '*'
- Sid: Allow use of the key
Effect: Allow
Principal: '*'
Action:
- kms:DescribeKey
- kms:Encrypt
- kms:Decrypt
- kms:ReEncrypt*
- kms:GenerateDataKey
- kms:GenerateDataKeyWithoutPlaintext
Resource: '*'
BuildProject:
[...]
EncryptionKey: !GetAtt
- KmsKey
- Arn
Pipeline:
[...]
EncryptionKey:
Id: !GetAtt
- KmsKey
- Arn
Type: KMS
Lors de l'écriture de cette partie de l'article, nous nous sommes rendu compte que la policy de la clé est p-e un peu trop permissive.
On devrait limiter l'utilisation de la clé au user root et aux rôles de CodeBuild et CodePipeline.
Cela sera corrigé plus tard cependant
La pipeline est toujours fonctionnelle au passage
step2.1_introduce-custom-kms-keystep2_deploy-test-accountBeaucoup de changements dans cette étape:
CloudFormation pour la création des rôles IAM dédiés aux déploiements dans le compte de testpipeline.env, en gros un fichier de properties pour spécifier les profiles de la CLI AWS liés aux comptes de la pipeline et au compte de testOn notera au passage que l'on éxécute 2 fois le template pre-requisites.yml, une première fois pour créer la clé, une deuxième fois pour modifier la policy associée afin de permettre aux différents rôles d'accéder à la clé.
On ne peut rajouter ces policies uniquement une fois que les rôles sont deja créés, sinon on obtient une erreur du genre "policy contains invalid principals".
Un nouveau piège AWS, dommage on ne peut pas avoir de template CloudFormation qui déploient des ressources différentes dans différents compte.
Malheureusement les StackSets déploient les mêmes ressources dans des comptes différents, et ça ne correspond pas à notre cas d'utilisation
Pour créer la pipeline:
pipeline.env avec les bons profiles de la CLI AWS et le nom du repo que vous avez forkécreate-pipeline.shCloudFormation, cela doit être fait manuellement "out of band")step2_deploy-test-accountstep3_deploy-test-and-prod-accountDans cette étape nous effectuons:
À la fin de cette étape, nous avons la pipeline cible, et nous sommes particulièrement fier de nous !
Déploiement de la pipeline:
~/.aws/config et ~/.aws/credentials
operations: le profile du compte dédié à l'éxécution de la pipeline,test: le profile du compte faisant office d'environnement de testprod: le profile du compte faisant office d'environnement de prodpipeline.env./create-pipeline.shNous avons réalisé la pipeline cible suivante:

Les suites seraient:
Terraform cette fois-ciElasticBeanstalk, sur EKS ou sur des EC2 gérés "manuellement"Ce projet fut parfois assez frustrant, les messages d'erreurs ne sont pas toujours très explicites (http 403 access denied sur S3 typiquement), pas toujours faciles d'accès dans CloudTrail, parfois la documentation des produits AWS est bonne ... et parfois non.
Quoiqu'il en soit, on ressort de ce projet grandi, et j'espère que vous l'apprécierez comme je l'ai appr
CloudFormation https://github.com/mbimbij/aws-serverless-cicd-demo