ALB Trigger Lamda функция отсутствует разрешение CDK - PullRequest
0 голосов
/ 03 февраля 2020

В настоящее время у меня есть проблема, чтобы вызвать функцию Lamda из ALB в качестве функции триггера. Я получаю сообщение об ошибке, что

elasticloadbalancing principal does not have permission to 
invoke arn:aws:lambda:us-east-2:ACN:function  
API: elasticloadbalancingv2:RegisterTargets elasticloadbalancing principal
does not have permission to invoke arn:aws:lambda:us-east-...function:Ddns
from target group arn:aws:elasticloadbalancing:us-east-2:...targetgroup/DdnsL


export class DdnsLamdaApiGateWayCdkStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const vpc = Vpc.fromLookup(this, 'global-vpc', {
      vpcId: 'vpc-a0b8bec8',
    });

    const sg = ec2.SecurityGroup.fromSecurityGroupId(this, 'SG', 'sg-0740900526b94fd8f')

    const fn = new lambda.Function(this, "API", {
      handler: 'index.handler',
      runtime: Runtime.NODEJS_12_X,
      role: Role.fromRoleArn(this, 'lambda-role', 'arn:aws:iam::.....:role/service-role/LamdaR'),
      code: Code.fromInline("test"),

    });

    fn.addToRolePolicy( new iam.PolicyStatement({
      effect: iam.Effect.ALLOW,
      actions: [
        "lambda:InvokeFunction"
      ],
      resources: [
        "*"
      ]

    }));

    const lb = new elbv2.ApplicationLoadBalancer(this, "LoadBalancer", {
      vpc,
      internetFacing: false,
      securityGroup: sg
    });

    const listener = lb.addListener("Listener", {
      port: 80,
    });

    listener.addTargets('Targets', {
      targets: [new LambdaALBTarget(fn)]
    });
  }
}

class LambdaALBTarget implements elbv2.IApplicationLoadBalancerTarget {
  private fn: lambda.IFunction;

  constructor(fn: lambda.IFunction) {
    this.fn = fn;
  }

  attachToApplicationTargetGroup(
      targetGroup: elbv2.ApplicationTargetGroup
  ): elbv2.LoadBalancerTargetProps {
    return {
      targetType: "lambda" as elbv2.TargetType,
      targetJson: {
        id: this.fn.functionArn
      }
    };
  }
}

Я предполагаю -> что мне не хватает именно этого Разрешения:

LambdaFunctionPermission:
        Type: AWS::Lambda::Permission
    Properties:
        Action: lambda:InvokeFunction
    FunctionName: !GetAtt LambdaTargetFunction.Arn
    Principal: elasticloadbalancing.amazonaws.com
    SourceArn: !Ref TargetGroup

Но я не могу понять, знаю, как включить это разрешение в данном исходном коде. У кого-нибудь была такая же проблема и знаете, как ее решить?

1 Ответ

0 голосов
/ 05 февраля 2020

Я нашел обходной путь, при котором разрешение устанавливается автоматически при развертывании стека вместо создания класса LambdaALBTarget, а затем вызывается метод attachToApplicationTargetGroup, просто добавьте (новый LambdaTarget) в слушатель -> attachToApplicationTargetGroup & attachToNetworkTargetGroup автоматически вызывается, когда вы добавьте цель в балансировщик нагрузки

listener.addTargets('Targets', {
      targets: [new LambdaTarget(fn)]
    });
...

здесь раздел разрешения созданной функции вызова (шаблон. json)

"APIInvokeServicePrincipalelasticloadbalancingamazonawscom68C82386": {
      "Type": "AWS::Lambda::Permission",
      "Properties": {
        "Action": "lambda:InvokeFunction",
        "FunctionName": {
          "Fn::GetAtt": [
            "API62EA1CFF",
            "Arn"
          ]
        },
        "Principal": "elasticloadbalancing.amazonaws.com"
      },
      "Metadata": {
        "aws:cdk:path": "DdnsLamdaApiGateWayCdkStack/API/InvokeServicePrincipal(elasticloadbalancing.amazonaws.com)"
      }

Вот готовый исходный код

export class DdnsLamdaApiGateWayCdkStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const vpc = Vpc.fromLookup(this, 'global-vpc', {
      vpcId: '....',
    });

    const code = fs.readFileSync('./code.js','utf8');


    const dnsRegistrationRole = new Role(this, 'DnsRegRole', {
        roleName: 'Lamda-DnsRegRole',
        managedPolicies: [
            ManagedPolicy.fromAwsManagedPolicyName('AmazonVPCFullAccess'),
            ManagedPolicy.fromAwsManagedPolicyName('AmazonRoute53AutoNamingRegistrantAccess'),
            ManagedPolicy.fromAwsManagedPolicyName('AWSLambdaBasicExecutionRole '),
        ],
        inlinePolicies: {
            Route53ListHostedZone: new PolicyDocument({
                statements: [
                    new PolicyStatement({
                        actions: ['route53:ListResourceRecordSets'],
                        resources: ['arn:aws:route53:::hostedzone/*'],
                    }),
                ],
            }),
        },
        assumedBy: new ServicePrincipal('lambda.amazonaws.com'),
    });

      const dnsRegistrationLambda = new lambda.Function(this, "API", {
          handler: 'index.handler',
          runtime: Runtime.NODEJS_12_X,
          role: dnsRegistrationRole,
          code: Code.fromInline(code),
          memorySize: 256,

      });

      const loadBalancerSecurityGroup = new ec2.SecurityGroup(this, "loadBalancer-security-group", {
      vpc: vpc,
      allowAllOutbound: true,
      description: 'loadBalancerSecurityGroup'
      });

    loadBalancerSecurityGroup.addIngressRule(ec2.Peer.anyIpv4(),ec2.Port.tcp(80),"HTTP");
    loadBalancerSecurityGroup.addIngressRule(ec2.Peer.anyIpv4(),ec2.Port.tcp(443),"HTTPS")


    const lb = new elbv2.ApplicationLoadBalancer(this, "LoadBalancer", {
      vpc,
      internetFacing: true,
      securityGroup: loadBalancerSecurityGroup
    });

    const listener = lb.addListener("Listener", {
      port: 80,
    });

    listener.addTargets('Targets', {
      targets: [new LambdaTarget(dnsRegistrationLambda)]
    });
  }
}

В основном я создал DNS-систему Dynami c без сервера с ALB & Lamda

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...