Wie tätige ich einen AWS SDK-call (Aufruf) von einem CDK-Projekt aus mithilfe der Schnittstelle AwsSDKCall?

Lesedauer: 3 Minute
0

Ich möchte AWS-SDK-Aufrufe von meinem AWS Cloud Development Kit-Projekt (AWS CDK) aus über die AWSSdkCall-Schnittstelle tätigen.

Kurzbeschreibung

Sie können Aufrufe des AWS Software Development Kit (AWS SDK) für Stack-Bereitstellungsszenarien verwenden, wie zum Beispiel:

  • Rufen Sie Konfigurationen ab, während ein Stack erstellt und dynamisch aktualisiert wird.
  • Rufen Sie Attribute von Ressourcen ab, die in den Rückgabewerten der Ressourcen in AWS CloudFormation nicht unterstützt werden.
  • Nehmen Sie kleine Patches oder Konfigurationsänderungen vor, die von AWS CloudFormation nicht unterstützt werden.

Sie können AWS-SDK-Aufrufe für verschiedene CloudFormation-Stack-Vorgangsereignisse wie Erstellen, Löschen oder Aktualisieren auslösen. Sie müssen keinen Zugriff und keine Tools für Ihre Bereitstellungspipeline einrichten, um AWS-SDK-Aufrufe tätigen zu können. Die AWS-SDK-Laufzeit wird vollständig vom AWS Cloud Development Kit (AWS CDK) eingerichtet. Außerdem können Sie den Zugriff für die AWS Lambda-Funktion hinter der benutzerdefinierten Ressource anpassen und einschränken.

Behebung

Hinweis: Die folgenden Beispiele in dieser Auflösung verwenden Python. Stellen Sie sicher, dass Sie Befehle verwenden, die für die von Ihnen verwendete Programmiersprache spezifisch sind.

Um einen AWS-SDK-Aufruf mit AwsSDKCall zu tätigen, müssen Sie drei grundlegende Parameter deklarieren:

  • Service — Dies ist der AWS-Service, den Sie anrufen möchten. Bei Werten wird zwischen Groß- und Kleinschreibung unterschieden.
  • Aktion - Dies ist der API-/Aktionsaufruf, den Sie tätigen möchten. Dies folgt normalerweise einem Kamelkastenmuster. Bei Werten wird zwischen Groß- und Kleinschreibung unterschieden.
  • Parameter — Dies sind die optionalen Parameter, die Sie beim API-/Aktionsaufruf übergeben. Sie können Parameter als Variable deklarieren und sie dann an die Schnittstelle übergeben, die einem JSON-Objekt für die API-Nutzlast ähnelt. Weitere Informationen finden Sie unter AWS SDK für JavaScript.

1.Rufen Sie eine Amazon Machine Image-ID vom AWS Systems Manager Kundendienstmitarbeiter ab:

Hinweis: Im folgenden Beispiel importieren Sie custom_resources als cr und aws_cdk als 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'))

Hinweis: Sie können die Antwort des API-Aufrufs mit dem Parameter get_response_field referenzieren.

2.Verschlüsseln Sie die Lambda-Protokollgruppe mit einem benutzerdefinierten KMS-Schlüssel:

Hinweis: Im folgenden Beispiel importieren Sie aus aws_cdk aws_lambda als **lambda_, ** custom_resources als cr, aws_kms als 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
                                                 )
                                                 )

Hinweis: Sie können die Eigenschaftsrichtlinie verwenden, um der Lambda-Funktion hinter der benutzerdefinierten Ressource Berechtigungen für API-Aufrufe zu erteilen. Wenn Sie from_sdk_calls() verwenden, wird jeder API-Aufruf in die entsprechenden AWS Identity and Access Management (IAM) -Berechtigungen übersetzt. Wenn nach der Synthese nicht die richtigen Berechtigungen hinzugefügt wurden, können Sie die Berechtigungen manuell mit from_statements() hinzufügen.

Beispiel:

policy=cr.AwsCustomResourcePolicy.from_statements(
                                                     statements=[iam.PolicyStatement(actions=[
                                                         'dynamodb:DescribeTable', 'dynamodb:ListTables'],
                                                         resources=['*'],
                                                     )]
                                                 )
AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr