Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
AWS CloudFormation Lambda Hooks vous permet d'évaluer CloudFormation et d'effectuer AWS Cloud Control API des opérations par rapport à votre propre code personnalisé. Votre Hook peut bloquer le déroulement d'une opération ou envoyer un avertissement à l'appelant et autoriser le déroulement de l'opération. Lorsque vous créez un Lambda Hook, vous pouvez le configurer pour intercepter et évaluer les opérations suivantes : CloudFormation
-
Opérations de ressources
-
Opérations de pile
-
Modifier les opérations du set
Rubriques
Développement d'un hook Lambda
Lorsque les Hooks invoquent votre Lambda, le Lambda attend jusqu'à 30 secondes pour évaluer l'entrée. Le Lambda renverra une JSON réponse indiquant si le Hook a réussi ou échoué.
Demande d'entrée
L'entrée transmise à votre fonction Lambda dépend de l'opération cible Hook (exemples : stack, resource ou change set).
Entrée de réponse
Afin de communiquer à Hooks si votre demande a réussi ou échoué, votre fonction Lambda doit renvoyer une JSON réponse.
Voici un exemple de forme de la réponse attendue par Hooks :
{
"hookStatus": "SUCCESS" or "FAILED" or "IN_PROGRESS",
"errorCode": None or "NonCompliant" or "InternalFailure"
"message": String,
"clientRequestToken": String
"callbackContext": None,
"callbackDelaySeconds": Integer,
}
- hookStatus
-
L'état du Hook. Ce champ est obligatoire.
Valeurs valides : (
SUCCESS
|FAILED
|IN_PROGRESS
)Note
Un Hook peut revenir
IN_PROGRESS
3 fois. Si aucun résultat n'est renvoyé, le Hook échouera. Pour un Lambda Hook, cela signifie que votre fonction Lambda peut être invoquée jusqu'à 3 fois. - errorCode
-
Indique si l'opération a été évaluée et jugée non valide, ou si des erreurs se sont produites dans le Hook, empêchant l'évaluation. Ce champ est obligatoire en cas d'échec du Hook.
Valeurs valides : (
NonCompliant
|InternalFailure
) - message
-
Le message envoyé à l'appelant expliquant pourquoi le Hook a réussi ou échoué.
Note
Lors de l'évaluation CloudFormation des opérations, ce champ est tronqué à 4 096 caractères.
Lors de l'évaluation API des opérations Cloud Control, ce champ est tronqué à 1024 caractères.
- clientRequestToken
-
Le jeton de demande qui a été fourni en entrée de la demande Hook. Ce champ est obligatoire.
- callbackContext
-
Si vous indiquez que
hookStatus
c'est le cas,IN_PROGRESS
vous transmettez un contexte supplémentaire fourni en entrée lorsque la fonction Lambda est réinvoquée. - callbackDelaySeconds
-
Combien de temps les Hooks doivent-ils attendre pour invoquer à nouveau ce Hook ?
Exemples
Voici un exemple de réponse réussie :
{
"hookStatus": "SUCCESS",
"message": "compliant",
"clientRequestToken": "123avjdjk31"
}
Voici un exemple d'échec de réponse :
{
"hookStatus": "FAILED",
"errorCode": "NON_COMPLIANT",
"message": "S3 Bucket Versioning must be enabled.",
"clientRequestToken": "123avjdjk31"
}
Évaluation des opérations sur les ressources avec les Lambda Hooks
Chaque fois que vous créez, mettez à jour ou supprimez une ressource, cela est considéré comme une opération de ressource. Par exemple, si vous exécutez la mise à jour d'une CloudFormation pile qui crée une nouvelle ressource, vous avez terminé une opération sur la ressource. Lorsque vous créez, mettez à jour ou supprimez une ressource à l'aide de Cloud ControlAPI, cela est également considéré comme une opération de ressource. Vous pouvez configurer votre CloudFormation Lambda Hook en fonction du ciblage RESOURCE
et CLOUD_CONTROL
des opérations dans la configuration du HookTargetOperations
.
Note
Le gestionnaire delete
Hook n'est invoqué que lorsqu'une ressource est supprimée à l'aide d'un déclencheur d'opération depuis cloud-control
delete-resource
oucloudformation delete-stack
.
Rubriques
Syntaxe d'entrée des ressources Lambda Hook
Lorsque votre Lambda est invoqué pour une opération sur une ressource, vous recevez une JSON entrée contenant les propriétés de la ressource, les propriétés proposées et le contexte de l'invocation de Hook.
Voici un exemple de forme de l'JSONentrée :
{
"awsAccountId": String,
"stackId": String,
"changeSetId": String,
"hookTypeName": String,
"hookTypeVersion": String,
"hookModel": {
"LambdaFunction": String
},
"actionInvocationPoint": "CREATE_PRE_PROVISION" or "UPDATE_PRE_PROVISION" or "DELETE_PRE_PROVISION"
"requestData": {
"targetName": String,
"targetType": String,
"targetLogicalId": String,
"targetModel": {
"resourceProperties": {...},
"previousResourceProperties": {...}
}
},
"requestContext": {
"invocation": 1,
"callbackContext": null
}
}
awsAccountId
-
ID du Compte AWS contenant la ressource en cours d'évaluation.
stackId
-
L'ID de pile de la CloudFormation pile dont cette opération fait partie. Ce champ est vide si l'appelant est Cloud ControlAPI.
changeSetId
-
L'ID de l'ensemble de modifications qui a initié l'invocation de Hook. Cette valeur est vide si le changement de ressource a été initié par Cloud Control API ou par les
delete-stack
opérationscreate-stack
update-stack
, ou. hookTypeName
-
Le nom du Hook en cours d'exécution.
hookTypeVersion
-
Version du Hook en cours d'exécution.
hookModel
-
LambdaFunction
-
Le Lambda actuel ARN invoqué par le Hook.
actionInvocationPoint
-
Point exact de la logique de provisionnement où le Hook s'exécute.
Valeurs valides : (
CREATE_PRE_PROVISION
|UPDATE_PRE_PROVISION
|DELETE_PRE_PROVISION
) requestData
-
targetName
-
Nom de la ressource cible en cours de création.
targetType
-
Le type de cible en cours de création, par exemple
AWS::S3::Bucket
. targetLogicalId
-
ID logique de la ressource en cours d'évaluation. Si l'origine de l'invocation de Hook est CloudFormation, il s'agira de l'ID de ressource logique défini dans votre CloudFormation modèle. Si l'origine de cette invocation de Hook est Cloud ControlAPI, il s'agira d'une valeur construite.
targetModel
-
resourceProperties
-
Les propriétés proposées pour la ressource en cours de modification. Si la ressource est supprimée, cette valeur sera vide.
previousResourceProperties
-
Les propriétés actuellement associées à la ressource en cours de modification. Si la ressource est créée, cette valeur sera vide.
requestContext
-
- invocation
-
La tentative actuelle d'exécution du Hook.
- callbackContext
-
Si le Hook a été réglé sur
IN_PROGRESS
etcallbackContext
a été renvoyé, il sera là après sa révocation.
Exemple d'entrée de modification de ressource Lambda Hook
Dans l'exemple de saisie suivant, le Guard Hook recevra la définition de la AWS::DynamoDB::Table
ressource en cours de modification. Les ReadCapacityUnits
paramètres ProvisionedThroughput
et sont mis à jour de 3 à 10.
Pour plus d'informations sur les propriétés disponibles pour la ressource, voir AWS: :DynamoDB : :Table.
{
"awsAccountId": "123456789",
"stackId": "arn:aws:cloudformation:eu-central-1:123456789:stack/test-stack/123456abcd",
"hookTypeName": "my::lambda::resourcehookfunction",
"hookTypeVersion": "00000008",
"hookModel": {
"LambdaFunction": "arn:aws:lambda:eu-central-1:123456789:function:resourcehookfunction"
},
"actionInvocationPoint": "UPDATE_PRE_PROVISION",
"requestData": {
"targetName": "AWS::DynamoDB::Table",
"targetType": "AWS::DynamoDB::Table",
"targetLogicalId": "DDBTable",
"targetModel": {
"resourceProperties": {
"AttributeDefinitions": [
{
"AttributeType": "S",
"AttributeName": "Album"
},
{
"AttributeType": "S",
"AttributeName": "Artist"
}
],
"ProvisionedThroughput": {
"WriteCapacityUnits": 5,
"ReadCapacityUnits": 10
},
"KeySchema": [
{
"KeyType": "HASH",
"AttributeName": "Album"
},
{
"KeyType": "RANGE",
"AttributeName": "Artist"
}
]
},
"previousResourceProperties": {
"AttributeDefinitions": [
{
"AttributeType": "S",
"AttributeName": "Album"
},
{
"AttributeType": "S",
"AttributeName": "Artist"
}
],
"ProvisionedThroughput": {
"WriteCapacityUnits": 5,
"ReadCapacityUnits": 5
},
"KeySchema": [
{
"KeyType": "HASH",
"AttributeName": "Album"
},
{
"KeyType": "RANGE",
"AttributeName": "Artist"
}
]
}
}
},
"requestContext": {
"invocation": 1,
"callbackContext": null
}
}
Exemple de fonction Lambda pour les opérations sur les ressources
Voici un exemple de cibles Lambda Hook. Node.js
Il s'agit d'une fonction simple qui échoue à toute mise à jour des ressources de DynamoDB, qui essaie de définir une valeur ProvisionedThroughput ReadCapacity
supérieure à 10. Si le Hook réussit, le message « ReadCapacity est correctement configuré » s'affichera à l'attention de l'appelant. Si la demande échoue à la validation, le Hook échouera avec le statut « ReadCapacity ne peut pas être supérieur à 10 ».
export const handler = async (event, context) => {
var targetModel = event?.requestData?.targetModel;
var targetName = event?.requestData?.targetName;
var response = {
"hookStatus": "SUCCESS",
"message": "ReadCapacity is correctly configured.",
"clientRequestToken": event.clientRequestToken
};
if (targetName == "AWS::DynamoDB::Table") {
var readCapacity = targetModel?.resourceProperties?.ProvisionedThroughput?.ReadCapacityUnits;
if (readCapacity > 10) {
response.hookStatus = "FAILED";
response.errorCode = "NonCompliant";
response.message = "ReadCapacity must be cannot be more than 10.";
}
}
return response;
};
Évaluation des opérations de stack avec les Lambda Hooks
Chaque fois que vous créez, mettez à jour ou supprimez une pile avec un nouveau modèle, vous pouvez configurer votre CloudFormation Lambda Hook pour commencer par évaluer le nouveau modèle et éventuellement bloquer le déroulement de l'opération de pile. Vous pouvez configurer votre CloudFormation Lambda Hook pour cibler les STACK
opérations dans la configuration HookTargetOperations
.
Rubriques
Syntaxe d'entrée Lambda Hook Stack
Lorsque votre Lambda est invoqué pour une opération de pile, vous recevez une JSON demande contenant le contexte d'invocation Hook et le contexte de la demande. actionInvocationPoint
En raison de la taille des CloudFormation modèles et de la taille d'entrée limitée acceptée par les fonctions Lambda, les modèles réels sont stockés dans un objet Amazon S3. L'entrée requestData
inclut un Amazon S3 affecté URL à un autre objet, qui contient la version actuelle et précédente du modèle.
Voici un exemple de forme de l'JSONentrée :
{
"clientRequesttoken": String,
"awsAccountId": String,
"stackID": String,
"changeSetId": String,
"hookTypeName": String,
"hookTypeVersion": String,
"hookModel": {
"LambdaFunction":String
},
"actionInvocationPoint": "CREATE_PRE_PROVISION" or "UPDATE_PRE_PROVISION" or "DELETE_PRE_PROVISION"
"requestData": {
"targetName": "STACK",
"targetType": "STACK",
"targetLogicalId": String,
"payload": String (S3 Presigned URL)
},
"requestContext": {
"invocation": Integer,
"callbackContext": String
}
}
clientRequesttoken
-
Le jeton de demande qui a été fourni en entrée de la demande Hook. Ce champ est obligatoire.
awsAccountId
-
L'ID du Compte AWS contenant la pile en cours d'évaluation.
stackID
-
L'ID de pile de la CloudFormation pile.
changeSetId
-
L'ID de l'ensemble de modifications qui a initié l'invocation de Hook. Cette valeur est vide si le changement de pile a été initié par Cloud Control API ou par les
delete-stack
opérationscreate-stack
update-stack
, ou. hookTypeName
-
Le nom du Hook en cours d'exécution.
hookTypeVersion
-
Version du Hook en cours d'exécution.
hookModel
-
LambdaFunction
-
Le Lambda actuel ARN invoqué par le Hook.
actionInvocationPoint
-
Point exact de la logique de provisionnement où le Hook s'exécute.
Valeurs valides : (
CREATE_PRE_PROVISION
|UPDATE_PRE_PROVISION
|DELETE_PRE_PROVISION
) requestData
-
targetName
-
Cette valeur sera
STACK
. targetType
-
Cette valeur sera
STACK
. targetLogicalId
-
Nom de la pile.
payload
-
L'Amazon S3 présigné URL contient un JSON objet avec les définitions de modèles actuelles et précédentes.
requestContext
-
Si le Hook est réinvoqué, cet objet sera défini.
invocation
-
La tentative actuelle d'exécution du Hook.
callbackContext
-
Si le Hook a été réglé sur
IN_PROGRESS
etcallbackContext
a été renvoyé, il sera présent lors de sa révocation.
La payload
propriété contenue dans les données de demande est URL celle que votre code doit récupérer. Une fois qu'il a reçu leURL, vous obtenez un objet avec le schéma suivant :
{
"template": String,
"previousTemplate": String
}
template
-
Le CloudFormation modèle complet qui a été fourni à
create-stack
ouupdate-stack
. Il peut s'agir d'une YAML chaîne JSON ou d'une chaîne en fonction de ce qui a été fourni à CloudFormation.Dans
delete-stack
les opérations, cette valeur sera vide. previousTemplate
-
Le CloudFormation modèle précédent. Il peut s'agir d'une YAML chaîne JSON ou d'une chaîne en fonction de ce qui a été fourni à CloudFormation.
Dans
delete-stack
les opérations, cette valeur sera vide.
Exemple d'entrée de modification de la pile Lambda Hook
Voici un exemple d'entrée de changement de pile. The Hook évalue une modification qui met le à jour ObjectLockEnabled
à true et ajoute une SQS file d'attente Amazon :
{
"clientRequestToken": "f8da6d11-b23f-48f4-814c-0fb6a667f50e",
"awsAccountId": "123456789",
"stackId": "arn:aws:cloudformation:eu-central-1:123456789:stack/david-ddb-test-stack/400b40f0-8e72-11ef-80ab-02f2902f0df1",
"changeSetId": null,
"hookTypeName": "my::lambda::stackhook",
"hookTypeVersion": "00000008",
"hookModel": {
"LambdaFunction": "arn:aws:lambda:eu-central-1:123456789:function:stackhookfunction"
},
"actionInvocationPoint": "UPDATE_PRE_PROVISION",
"requestData": {
"targetName": "STACK",
"targetType": "STACK",
"targetLogicalId": "my-cloudformation-stack",
"payload": "https://s3......"
},
"requestContext": {
"invocation": 1,
"callbackContext": null
}
}
Voici un exemple payload
de requestData
:
{
"template": "{\"Resources\":{\"S3Bucket\":{\"Type\":\"AWS::S3::Bucket\",\"Properties\":{\"ObjectLockEnabled\":true}},\"SQSQueue\":{\"Type\":\"AWS::SQS::Queue\",\"Properties\":{\"QueueName\":\"NewQueue\"}}}}",
"previousTemplate": "{\"Resources\":{\"S3Bucket\":{\"Type\":\"AWS::S3::Bucket\",\"Properties\":{\"ObjectLockEnabled\":false}}}}"
}
Exemple de fonction Lambda pour les opérations de stack
L'exemple suivant Lambda Hook cible. Node.js
Il s'agit d'une fonction simple qui télécharge la charge utile de l'opération de pile, analyse le modèle et JSON renvoie. SUCCESS
export const handler = async (event, context) => {
var targetType = event?.requestData?.targetType;
var payloadUrl = event?.requestData?.payload;
var response = {
"hookStatus": "SUCCESS",
"message": "Stack update is compliant",
"clientRequestToken": event.clientRequestToken
};
try {
const templateHookPayloadRequest = await fetch(payloadUrl);
const templateHookPayload = await templateHookPayloadRequest.json()
if (templateHookPayload.template) {
// Do something with the template templateHookPayload.template
// JSON or YAML
}
if (templateHookPayload.previousTemplate) {
// Do something with the template templateHookPayload.previousTemplate
// JSON or YAML
}
} catch (error) {
console.log(error);
response.hookStatus = "FAILED";
response.message = "Failed to evaluate stack operation.";
response.errorCode = "InternalFailure";
}
return response;
};
Évaluation des opérations relatives aux ensembles de modifications à l'aide de Lambda Hooks
Chaque fois que vous créez un ensemble de modifications, vous pouvez configurer votre CloudFormation Lambda Hook pour d'abord évaluer le nouvel ensemble de modifications et éventuellement bloquer son exécution. Vous pouvez configurer votre CloudFormation Lambda Hook pour cibler les CHANGE_SET
opérations dans la configuration HookTargetOperations
.
Rubriques
Lambda Hook modifie la syntaxe d'entrée du set
L'entrée pour les opérations d'ensemble de modifications est similaire à celle des opérations de pile, mais la charge utile des opérations inclut requestData
également une liste des modifications de ressources introduites par l'ensemble de modifications.
Voici un exemple de forme de l'JSONentrée :
{
"clientRequesttoken": String,
"awsAccountId": String,
"stackID": String,
"changeSetId": String,
"hookTypeName": String,
"hookTypeVersion": String,
"hookModel": {
"LambdaFunction":String
},
"requestData": {
"targetName": "CHANGE_SET",
"targetType": "CHANGE_SET",
"targetLogicalId": String,
"payload": String (S3 Presigned URL)
},
"requestContext": {
"invocation": Integer,
"callbackContext": String
}
}
clientRequesttoken
-
Le jeton de demande qui a été fourni en entrée de la demande Hook. Ce champ est obligatoire.
awsAccountId
-
ID du Compte AWS contenant la pile en cours d'évaluation.
stackID
-
L'ID de pile de la CloudFormation pile.
changeSetId
-
L'ID de l'ensemble de modifications qui a initié l'invocation de Hook.
hookTypeName
-
Le nom du Hook en cours d'exécution.
hookTypeVersion
-
Version du Hook en cours d'exécution.
hookModel
-
LambdaFunction
-
Le Lambda actuel ARN invoqué par le Hook.
requestData
-
targetName
-
Cette valeur sera
CHANGE_SET
. targetType
-
Cette valeur sera
CHANGE_SET
. targetLogicalId
-
Le kit de modificationsARN.
payload
-
L'Amazon S3 présigné URL contient un JSON objet avec le modèle actuel, ainsi qu'une liste des modifications introduites par cet ensemble de modifications.
requestContext
-
Si le Hook est réinvoqué, cet objet sera défini.
invocation
-
La tentative actuelle d'exécution du Hook.
callbackContext
-
Si le Hook a été réglé sur
IN_PROGRESS
etcallbackContext
a été renvoyé, il sera présent lors de sa révocation.
La payload
propriété contenue dans les données de demande est URL celle que votre code doit récupérer. Une fois qu'il a reçu leURL, vous obtenez un objet avec le schéma suivant :
{
"template": String,
"changedResources": [
{
"action": String,
"beforeContext": JSON String,
"afterContext": JSON String,
"lineNumber": Integer,
"logicalResourceId": String,
"resourceType": String
}
]
}
template
-
Le CloudFormation modèle complet qui a été fourni à
create-stack
ouupdate-stack
. Il peut s'agir d'une YAML chaîne JSON ou d'une chaîne en fonction de ce qui a été fourni à CloudFormation. changedResources
-
Liste des ressources modifiées.
action
-
Type de modification appliqué à la ressource.
Valeurs valides : (
CREATE
|UPDATE
|DELETE
) beforeContext
-
JSONChaîne contenant les propriétés de la ressource avant la modification. Cette valeur est nulle lors de la création de la ressource. Toutes les valeurs booléennes et numériques de cette JSON chaîne sont. STRINGS
afterContext
-
JSONChaîne contenant les propriétés des ressources si cet ensemble de modifications est exécuté. Cette valeur est nulle lorsque la ressource est supprimée. Toutes les valeurs booléennes et numériques de cette JSON chaîne sont. STRINGS
lineNumber
-
Numéro de ligne du modèle à l'origine de cette modification. Si c'est le cas,
DELETE
cette valeur sera nulle. logicalResourceId
-
ID de ressource logique de la ressource en cours de modification.
resourceType
-
Type de ressource en cours de modification.
Exemple : Lambda Hook change Set, change d'entrée
Voici un exemple d'entrée de modification d'ensemble de modifications. Dans l'exemple suivant, vous pouvez voir les modifications introduites par l'ensemble de modifications. La première modification consiste à supprimer une file d'attente appeléeCoolQueue
. La deuxième modification consiste à ajouter une nouvelle file d'attente appeléeNewCoolQueue
. La dernière modification est une mise à jour duDynamoDBTable
.
{
"clientRequestToken": "f8da6d11-b23f-48f4-814c-0fb6a667f50e",
"awsAccountId": "123456789",
"stackId": "arn:aws:cloudformation:eu-central-1:123456789:stack/david-ddb-test-stack/400b40f0-8e72-11ef-80ab-02f2902f0df1",
"changeSetId": "arn:aws:cloudformation:eu-central-1:123456789:changeSet/davids-change-set/59ebd63c-7c89-4771-a576-74c3047c15c6",
"hookTypeName": "my::lambda::changesethook",
"hookTypeVersion": "00000008",
"hookModel": {
"LambdaFunction": "arn:aws:lambda:eu-central-1:123456789:function:changesethookfunction"
},
"actionInvocationPoint": "CREATE_PRE_PROVISION",
"requestData": {
"targetName": "CHANGE_SET",
"targetType": "CHANGE_SET",
"targetLogicalId": "arn:aws:cloudformation:eu-central-1:123456789:changeSet/davids-change-set/59ebd63c-7c89-4771-a576-74c3047c15c6",
"payload": "https://s3......"
},
"requestContext": {
"invocation": 1,
"callbackContext": null
}
}
Voici un exemple payload
de requestData.payload
:
{
template: 'Resources:\n' +
' DynamoDBTable:\n' +
' Type: AWS::DynamoDB::Table\n' +
' Properties:\n' +
' AttributeDefinitions:\n' +
' - AttributeName: "PK"\n' +
' AttributeType: "S"\n' +
' BillingMode: "PAY_PER_REQUEST"\n' +
' KeySchema:\n' +
' - AttributeName: "PK"\n' +
' KeyType: "HASH"\n' +
' PointInTimeRecoverySpecification:\n' +
' PointInTimeRecoveryEnabled: false\n' +
' NewSQSQueue:\n' +
' Type: AWS::SQS::Queue\n' +
' Properties:\n' +
' QueueName: "NewCoolQueue"',
changedResources: [
{
logicalResourceId: 'SQSQueue',
resourceType: 'AWS::SQS::Queue',
action: 'DELETE',
lineNumber: null,
beforeContext: '{"Properties":{"QueueName":"CoolQueue"}}',
afterContext: null
},
{
logicalResourceId: 'NewSQSQueue',
resourceType: 'AWS::SQS::Queue',
action: 'CREATE',
lineNumber: 14,
beforeContext: null,
afterContext: '{"Properties":{"QueueName":"NewCoolQueue"}}'
},
{
logicalResourceId: 'DynamoDBTable',
resourceType: 'AWS::DynamoDB::Table',
action: 'UPDATE',
lineNumber: 2,
beforeContext: '{"Properties":{"BillingMode":"PAY_PER_REQUEST","AttributeDefinitions":[{"AttributeType":"S","AttributeName":"PK"}],"KeySchema":[{"KeyType":"HASH","AttributeName":"PK"}]}}',
afterContext: '{"Properties":{"BillingMode":"PAY_PER_REQUEST","PointInTimeRecoverySpecification":{"PointInTimeRecoveryEnabled":"false"},"AttributeDefinitions":[{"AttributeType":"S","AttributeName":"PK"}],"KeySchema":[{"KeyType":"HASH","AttributeName":"PK"}]}}'
}
]
}
Exemple de fonction Lambda pour les opérations d'ensemble de modifications
L'exemple suivant Lambda Hook cible. Node.js
Il s'agit d'une fonction simple qui télécharge la charge utile de l'opération d'ensemble de modifications, passe en revue chaque modification, puis imprime les propriétés avant et après avant de renvoyer unSUCCESS
.
export const handler = async (event, context) => {
var payloadUrl = event?.requestData?.payload;
var response = {
"hookStatus": "SUCCESS",
"message": "Change set changes are compliant",
"clientRequestToken": event.clientRequestToken
};
try {
const changeSetHookPayloadRequest = await fetch(payloadUrl);
const changeSetHookPayload = await changeSetHookPayloadRequest.json();
const changes = changeSetHookPayload.changedResources || [];
for(const change of changes) {
var beforeContext = {};
var afterContext = {};
if(change.beforeContext) {
beforeContext = JSON.parse(change.beforeContext);
}
if(change.afterContext) {
afterContext = JSON.parse(change.afterContext);
}
console.log(beforeContext)
console.log(afterContext)
// Evaluate Change here
}
} catch (error) {
console.log(error);
response.hookStatus = "FAILED";
response.message = "Failed to evaluate change set operation.";
response.errorCode = "InternalFailure";
}
return response;
};