Je souhaite effectuer des appels AWS SDK depuis mon projet AWS Cloud Development Kit (AWS CDK) à l'aide de l'interface AWSSdkCall.
Brève description
Vous pouvez utiliser les appels AWS Software Development Kit (AWS SDK) pour des scénarios de déploiement de piles tels que :
- Récupérez les configurations lors de la création et de la mise à jour dynamique d'une pile.
- Récupérez les attributs des ressources qui ne sont pas pris en charge dans les valeurs de retour des ressources dans AWS CloudFormation.
- Apportez de petits correctifs ou des modifications de configuration qui ne sont pas pris en charge par AWS CloudFormation.
Vous pouvez déclencher des appels AWS SDK lors de différents événements opérationnels de la pile CloudFormation, tels que Créer, Supprimer, ou Mettre à jour. Vous n'avez pas besoin de configurer l'accès ni les outils nécessaires à votre pipeline de déploiement pour effectuer des appels au SDK AWS. L'environnement d'exécution du SDK AWS est entièrement configuré par AWS Cloud Development Kit (AWS CDK). Vous pouvez également personnaliser et limiter l'accès à la fonction AWS Lambda associée à la ressource personnalisée.
Résolution
Remarque : Les exemples suivants de cette résolution utilisent Python. Veillez à utiliser les commandes spécifiques au langage de programmation que vous utilisez.
Pour effectuer un appel AWS SDK à l'aide de AWSSdkCall, vous devez déclarer trois paramètres de base :
- Service - Il s'agit du service AWS que vous souhaitez appeler. Les valeurs distinguent les majuscules des minuscules.
- Action - Il s'agit de l'appel API/action que vous souhaitez effectuer. Cela suit généralement le format ’camel-case’. Les valeurs distinguent les majuscules des minuscules.
- Paramètres - Il s'agit des paramètres facultatifs que vous transmettez lors de l'appel API/action. Vous pouvez déclarer des paramètres sous forme de variable, puis les transmettre à l'interface sous la forme d'un objet JSON pour la charge utile de l'API. Pour plus d'informations, consultez le kit SDK AWS pour JavaScript.
1. Récupérez un identifiant d'image de machine Amazon depuis l'agent AWS Systems Manager :
Remarque : Dans l'exemple suivant, importez des custom_resources en tant que cr et aws_cdk en tant que cdk.
get_ami_id = cr.AwsCustomResource(self, "GetAMIId",
on_create=cr.AwsSdkCall(
service="SSM",
action="getParameter",
parameters={
"Name": "/aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-5.10-hvm-x86_64-gp2"
},
physical_resource_id=cr.PhysicalResourceId.of('get-ami-id')),
policy=cr.AwsCustomResourcePolicy.from_sdk_calls(
resources=cr.AwsCustomResourcePolicy.ANY_RESOURCE
))
cdk.CfnOutput(self, 'ImageId', value=get_ami_id.get_response_field('Parameter.Value'))
Remarque : Vous pouvez référencer la réponse de l'appel d'API à l'aide du paramètre get_response_field.
2. Chiffrez le groupe de journaux Lambda à l'aide d'une clé KMS personnalisée :
Remarque : Dans l'exemple suivant, depuis aws_cdk, importez aws_lambda en tant que lambda_, custom_resources en tant que cr, et aws_kms en tant que kms.
encryption_key = kms.Key(self, 'Key')
encryption_key.grant_encrypt_decrypt(
iam.ServicePrincipal('logs.amazonaws.com'))
fn = lambda_.Function(self, "MyFunction",
runtime=lambda_.Runtime.NODEJS_16_X,
handler="index.handler",
code=lambda_.Code.from_inline("hello world"))
associate_kms_key = cr.AwsCustomResource(self, "AssociateKmsKey",
on_create=cr.AwsSdkCall(
service="CloudWatchLogs",
action="associateKmsKey",
parameters={
"kmsKeyId": encryption_key.key_arn,
"logGroupName": fn.log_group.log_group_name
},
physical_resource_id=cr.PhysicalResourceId.of("associate-kms-key")),
policy=cr.AwsCustomResourcePolicy.from_sdk_calls(
resources=cr.AwsCustomResourcePolicy.ANY_RESOURCE
)
)
Remarque : Vous pouvez utiliser la politique de propriété pour accorder des autorisations à la fonction Lambda associée à la ressource personnalisée afin d'effectuer des appels d'API. Si vous utilisez from_sdk_calls(), chaque appel d'API est traduit en autorisations AWS Identity and Access Management (IAM) correspondantes. Si les autorisations correctes ne sont pas ajoutées après la synthèse, vous pouvez les ajouter manuellement à l'aide de from_statements().
Exemple :
policy=cr.AwsCustomResourcePolicy.from_statements(
statements=[iam.PolicyStatement(actions=[
'dynamodb:DescribeTable', 'dynamodb:ListTables'],
resources=['*'],
)]
)