Come posso usare le funzioni Lambda in un Amazon VPC per recuperare i segreti di Secrets Manager?

4 minuti di lettura
0

La mia funzione AWS Lambda in un Amazon Virtual Private Cloud (Amazon VPC) non può accedere ad AWS Secrets Manager.

Breve descrizione

Le funzioni Lambda vengono eseguite in un Amazon VPC sicuro con accesso ai servizi AWS e a Internet. Il servizio Lambda possiede questo Amazon VPC e non è connesso al tuo Amazon VPC predefinito.

Le funzioni Lambda connesse al tuo Amazon VPC possono accedere a Internet solo quando configuri Amazon VPC per fornire l'accesso. Le interfacce di rete create da Lambda all'interno di Amazon VPC utilizzano indirizzi IP privati e non possono connettersi a Internet utilizzando un gateway Internet.

Per ulteriori informazioni, consulta Accesso a Internet e ai servizi per funzioni connesse a un VPC.

Nota: È consigliabile non inserire funzioni Lambda in un Amazon VPC a meno che la funzione non debba accedere ad altre risorse in Amazon VPC.

Soluzione

Configurazione della rete Lambda

Per consentire a una funzione Lambda connessa a un Amazon VPC di accedere a Secrets Manager, segui uno dei metodi seguenti:

Collega un gateway NAT a una sottorete privata

Fornisci alla tua funzione l'accesso a Internet. Posiziona la funzione in sottoreti private e indirizza il traffico in uscita verso un gateway NAT in una sottorete pubblica. Il gateway NAT ha un indirizzo IP pubblico e si connette a Internet tramite il gateway Internet del VPC.

Usa un endpoint di interfaccia Amazon VPC

Configura un endpoint di interfaccia Amazon VPC per Secrets Manager. Il tuo Amazon VPC collega quindi Secrets Manager alla tua funzione Lambda senza accesso a Internet. Verifica che il gruppo di sicurezza degli endpoint Amazon VPC consenta il traffico in entrata della porta 443 dal gruppo di sicurezza o dall'intervallo di indirizzi IP Lambda. Verifica anche che il gruppo di sicurezza Lambda consenta il traffico in uscita della porta 443 verso il gruppo di sicurezza degli endpoint Amazon VPC o l'intervallo di indirizzi IP.

**Nota:**Se utilizzi endpoint VPC di AWS PrivateLink, assicurati di configurare le opzioni DHCP con Amazon VPC per sistema dei nomi di dominio (DNS). Per ulteriori informazioni, consulta gli attributi DNS per Amazon VPC.

Ad esempio, il seguente modello di AWS CloudFormation stabilisce una funzione Lambda all'interno della sottorete privata di un VPC. Ciò consente l'accesso privato ad AWS Secrets Manager tramite endpoint VPC:

AWSTemplateFormatVersion: "2010-09-09"
Description: "Lambda Secrets Manager"
Resources:
    EC2SecurityGroup:
        Type: "AWS::EC2::SecurityGroup"
        Properties:
            GroupDescription: "launch-wizard-19 created 2022-03-23T11:10:16.721+05:30"
            GroupName: "launch-wizard-19"
            VpcId: !Ref EC2VPC
            SecurityGroupIngress:
              -
                CidrIp: "10.0.0.0/16"
                FromPort: 443
                IpProtocol: "tcp"
                ToPort: 443
            SecurityGroupEgress:
              -
                CidrIp: "10.0.0.0/16"
                FromPort: 443
                IpProtocol: "tcp"
                ToPort: 443


    LambdaFunction:
        Type: "AWS::Lambda::Function"
        Properties:
            Description: "AWS Lambda to AWS Secrets Manager"
            FunctionName: "SecretsManagerLambda"
            Handler: "index.lambda_handler"
            Architectures:
              - "x86_64"
            Code:
              ZipFile: |
                import json
                import boto3
                client = boto3.client('secretsmanager')

                def lambda_handler(event, context):
                    response = client.get_secret_value(
                    SecretId='string',
                    VersionId='string',
                    VersionStage='string'
                    )
                    print(response)
                    # TODO implement
                    return {
                        'statusCode': 200,
                        'body': json.dumps('Hello from Lambda!')
                    }



            MemorySize: 128
            Role: !GetAtt IAMRole.Arn
            Runtime: "python3.11"
            Timeout: 30
            TracingConfig:
                Mode: "PassThrough"
            EphemeralStorage:
                Size: 512
            VpcConfig:
              SecurityGroupIds:
                - !Ref EC2SecurityGroup
              SubnetIds:
                - !Ref EC2Subnet

    EC2VPC:
        Type: "AWS::EC2::VPC"
        Properties:
            CidrBlock: "10.0.0.0/16"
            EnableDnsSupport: true
            EnableDnsHostnames: true
            InstanceTenancy: "default"

    EC2Subnet:
        Type: "AWS::EC2::Subnet"
        Properties:
            AvailabilityZone: !Sub "${AWS::Region}b"
            CidrBlock: "10.0.7.0/24"
            VpcId: !Ref EC2VPC
            MapPublicIpOnLaunch: false
            Tags:
              -
                Key: "Name"
                Value: "Private-new-availability"

    EC2VPCEndpoint:
        Type: "AWS::EC2::VPCEndpoint"
        Properties:
            VpcEndpointType: "Interface"
            VpcId: !GetAtt EC2Subnet.VpcId
            ServiceName: !Sub "com.amazonaws.${AWS::Region}.secretsmanager"
            PolicyDocument: |
                {
                  "Statement": [
                    {
                      "Action": "*",
                      "Effect": "Allow",
                      "Principal": "*",
                      "Resource": "*"
                    }
                  ]
                }
            SubnetIds:
              - !Ref EC2Subnet
            PrivateDnsEnabled: true
            SecurityGroupIds:
              - !Ref EC2SecurityGroup

    IAMRole:
        Type: "AWS::IAM::Role"
        Properties:
            Path: "/"
            RoleName: "Lambdapermissions"
            AssumeRolePolicyDocument: "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"lambda.amazonaws.com\"},\"Action\":\"sts:AssumeRole\"}]}"
            ManagedPolicyArns:
              - !Ref IAMManagedPolicy


            Description: "Allows Lambda functions to call AWS services on your behalf."

    IAMManagedPolicy:
        Type: "AWS::IAM::ManagedPolicy"
        Properties:
            ManagedPolicyName: "LambdaSecretsPolicy"
            Path: "/"
            PolicyDocument: |
                {
                    "Version": "2012-10-17",
                    "Statement": [
                        {
                            "Sid": "Statement1",
                            "Effect": "Allow",
                            "Action": [
                                "secretsmanager:GetSecretValue",
                                "ec2:CreateNetworkInterface",
                                "ec2:DescribeNetworkInterfaces",
                                "ec2:DeleteNetworkInterface"
                            ],
                            "Resource": "*"
                        }
                    ]
                }

Autorizzazioni per i ruoli di esecuzione Lambda

Concedi le autorizzazioni al ruolo di esecuzione di Lambda per accedere ai segreti di Secrets Manager. Usa la chiamata all'API GetSecretValue per ottenere il segreto di Secrets Manager. Per ulteriori informazioni, consulta Esempio: Autorizzazione a recuperare valori segreti.

(Facoltativo) Autorizzazioni del Sistema AWS di gestione delle chiavi

Se il segreto di Secrets Manager è crittografato con una chiave gestita dal cliente di AWS KMS anziché con la chiave gestita aws/secretsmanager, è necessaria una configurazione aggiuntiva. Assicurati di consentire l'autorizzazione all'azione dell'API Decrypt come ruolo di esecuzione Lambda o come policy chiave di AWS KMS.

Informazioni correlate

Come posso risolvere i problemi relativi alle autorizzazioni con Lambda?