Como fazer uma chamada do AWS SDK a partir de um projeto CDK usando a interface AwsSdkCall?

3 minuto de leitura
0

Quero fazer chamadas do AWS SDK a partir do meu projeto do AWS Cloud Development Kit (AWS CDK) usando a interface AwsSdkCall.

Breve descrição

Você pode usar as chamadas do AWS Software Development Kit (AWS SDK) para cenários de implantação de pilhas, como:

  • Recupere configurações enquanto uma pilha está sendo criada e atualizada dinamicamente.
  • Recupere atributos de recursos que não são suportados nos valores de retorno dos recursos no AWS CloudFormation.
  • Faça pequenos patches ou alterações de configuração que não sejam compatíveis com o AWS CloudFormation.

Você pode acionar chamadas do AWS SDK em diferentes eventos de operação de pilha do CloudFormation, como Criar, Excluir ou Atualizar. Você não precisa configurar o acesso e as ferramentas do seu pipeline de implantação para fazer chamadas do AWS SDK. O tempo de execução do AWS SDK é totalmente configurado pelo AWS Cloud Development Kit (AWS CDK). Além disso, você pode personalizar e limitar o acesso à função do AWS Lambda por trás do recurso personalizado.

Resolução

Observação: os exemplos a seguir nesta resolução usam Python. Certifique-se de usar comandos específicos para a linguagem de programação que você está usando.

Para fazer uma chamada do AWS SDK usando AwsSdkCall, você deve declarar três parâmetros básicos:

  • Serviço — Esse é o serviço da AWS que você pretende chamar. Os valores diferenciam maiúsculas de minúsculas.
  • Ação — Essa é a chamada de API/ação que você pretende fazer. Isso geralmente segue um padrão camel-case (maiúsculas e minúsculas misturadas). Os valores diferenciam maiúsculas de minúsculas.
  • Parâmetros — Esses são os parâmetros opcionais que você passa ao fazer a chamada de API/ação. Você pode declarar parâmetros como uma variável e, em seguida, passá-los para a interface semelhante a um objeto JSON para carga útil da API. Para obter mais informações, consulte AWS SDK para JavaScript.

1.    Recupere um ID de imagem de máquina da Amazon do AWS Systems Manager Agent:

Observação: no exemplo a seguir, importe custom_resources como cr e aws_cdk como 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'))

Observação: você pode referenciar a resposta da chamada da API com o parâmetro get_response_field.

2.    Criptografe o grupo de logs do Lambda usando uma chave KMS personalizada:

Observação: no exemplo a seguir, da importação de aws_cdk aws_lambda como lambda_, custom_resources como cr e aws_kms como 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
                                                 )
                                                 )

Observação: você pode usar a política de propriedades para conceder permissões à função Lambda por trás do recurso personalizado para fazer chamadas de API. Se você usar from_sdk_calls(), cada chamada de API será traduzida nas permissões correspondentes do AWS Identity and Access Management (IAM). Se as permissões corretas não forem adicionadas após a síntese, você poderá adicioná-las manualmente usando from_statements().

Exemplo:

policy=cr.AwsCustomResourcePolicy.from_statements(
                                                     statements=[iam.PolicyStatement(actions=[
                                                         'dynamodb:DescribeTable', 'dynamodb:ListTables'],
                                                         resources=['*'],
                                                     )]
                                                 )
AWS OFICIAL
AWS OFICIALAtualizada há 10 meses