Бессерверная функция AWS: не удается получить доступ к методам объектов aws-sdk … «не является функцией»

#node.js #amazon-web-services #aws-lambda #amazon-cloudformation #aws-serverless

#node.js #amazon-веб-сервисы #aws-lambda #amazon-cloudformation #aws-бессерверная

Вопрос:

У меня есть бессерверная функция внутри шаблона CloudFormation, предназначенная для создания экземпляра AWS Connect. Однако я не могу получить доступ к каким-либо методам объекта aws-sdk, выдается ошибка «connect.CreateInstance не является функцией». Когда я вызываю getOwnPropertyNames для объекта, он возвращает следующее вместо методов, к которым я пытаюсь получить доступ: [ ‘config’, ‘isGlobalEndpoint’, ‘endpoint’, ‘_events’, ‘MONITOR_EVENTS_BUBBLE’, ‘CALL_EVENTS_BUBBLE’, ‘_originalConfig’, ‘_clientId’ ]

В качестве теста я создал экземпляр объекта S3 и вызвал getOwnPropertyNames, который возвращает то же самое. Что я делаю не так? Я следую канонической форме здесь:

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Connect.html#createInstance-property

 AWSTemplateFormatVersion: "2010-09-09"
Transform: "AWS::Serverless-2016-10-31"
Parameters:
  IdentityManagementType:
    Description: The type of identity management for your Amazon Connect users.
    Type: String
    AllowedValues: ["SAML", "CONNECT_MANAGED", "EXISTING_DIRECTORY"]
    Default: "SAML"
  InboundCallsEnabled:
    Description: Whether your contact center handles incoming contacts.
    Type: String
    AllowedValues: [true, false]
    Default: true
  InstanceAlias:
    Description: The name for your instance.
    Type: String
    MaxLength: 62
  OutboundCallsEnabled:
    Description: Whether your contact center allows outbound calls.
    Type: String
    AllowedValues: [true, false]
    Default: true
  DirectoryId:
    Description: Optional. The identifier for the directory, if using this type of Identity Management.
    Type: String
  ClientToken:
    Description: Optional. The idempotency token. Used for concurrent deployments
    Type: String
    MaxLength: 500
  Region:
    Description: Region to place the AWS Connect Instance
    Type: String
    Default: us-east-1

#Handler for optional values
Conditions:
  HasClientToken: !Not
    - !Equals
      - ""
      - !Ref ClientToken
  HasDirectoryId: !Not
    - !Equals
      - ""
      - !Ref DirectoryId

Resources:
  LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: "/"
      Policies:
        - PolicyName: AWSConnect
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - connect:*
                Resource: arn:aws:connect:*:*
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

  CreateConnectInstance:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.handler
      Runtime: nodejs12.x
      Description: Invoke a function to create an AWS Connect instance
      MemorySize: 128
      Timeout: 8
      Role: !GetAtt LambdaExecutionRole.Arn
      Tracing: Active
      Environment:
        Variables:
          IdentityManagementType:
            Ref: IdentityManagementType
          InboundCallsEnabled:
            Ref: InboundCallsEnabled
          InstanceAlias:
            Ref: InstanceAlias
          OutboundCallsEnabled:
            Ref: OutboundCallsEnabled
          Region:
            Ref: Region
          #Optional Values
          ClientToken: !If
            - HasClientToken
            - !Ref ClientToken
            - !Ref "AWS::NoValue"
          DirectoryId: !If
            - HasClientToken
            - !Ref ClientToken
            - !Ref "AWS::NoValue"
      InlineCode: |
        var AWS = require('aws-sdk');
        var params = {
          IdentityManagementType: process.env.IdentityManagementType,
          InboundCallsEnabled: process.env.InboundCallsEnabled,
          OutboundCallsEnabled: process.env.OutboundCallsEnabled,
          ClientToken: process.env.ClientToken,
          DirectoryId: process.env.DirectoryId,
          InstanceAlias: process.env.InstanceAlias,
        };
        var connect = new AWS.Connect({apiVersion: '2017-08-08'});
        console.log(Object.getOwnPropertyNames(connect)); // ***Not what's expected***
        var createConnectRequest = connect.createInstance(params, function(err, data) {
          if (err) console.log(err, err.stack);
          else     console.log(data);
        }); // ***connect.createInstance is not a function***

  InvokeLambda:
    Type: AWS::CloudFormation::CustomResource
    DependsOn: CreateConnectInstance
    Version: "1.0"
    Properties:
      ServiceToken: !Sub ${CreateConnectInstance.Arn}
 

Комментарии:

1. Node.js Среда выполнения Lambda включает AWS SDK 2.771.0. Возможно, вам захочется проверить за пределами Lambda, поддерживает ли эта конкретная версия SDK метод CreateInstance Connect.

2. Поскольку я явно закрепляю apiVersion, и при создании экземпляра этого объекта ошибка не возникает, я бы ожидал, что метод будет существовать и документация, на которую я ссылался, будет применяться: var connect = new AWS. Connect({apiVersion: ‘2017-08-08’}); Если это неверное предположение, кто-нибудь, пожалуйста, вмешайтесь.

3. Неверное предположение afaik.

Ответ №1:

Метод AWS Connect createInstance недоступен в AWS SDK, который в настоящее время развернут с AWS Lambda Node.js время выполнения (версия v2.771.0 на момент написания). Похоже, что API CreateInstance находится в предварительной версии.

Эта функция была введена в версии 2.797.0. Вы можете проверить это локально (за пределами Lambda). Я проверил это с помощью бинарного подхода к тестированию версий AWS SDK от 2.771.0 до текущей (2.809.0) и следующего простого кода:

 const AWS = require('aws-sdk');
const connect = new AWS.Connect({apiVersion: '2017-08-08'});
connect.createInstance('fred');
 

Список изменений показывает это для версии v2.797.0 (среди прочего):

функция: Подключение: в этом выпуске добавлен набор API Amazon Connect для программного управления созданием, модификацией, описанием и удалением экземпляров.

Вы можете загрузить совместимую версию SDK (в вашем лямбда-пакете или через лямбда-слой), чтобы получить доступ к этой функции.

Комментарии:

1. Отличный ответ, большое спасибо и бонусные баллы за объяснение вашей методологии и связывание журнала изменений и решения.

2. В качестве дополнительного примечания кажется, что api не выдает ошибку, когда вы создаете экземпляр объекта с apiVersion, который он на самом деле не использует.

3. Он использует эту версию API и поддерживает API Connect. Проблема, с которой вы сталкиваетесь, заключается в том, что CreateInstance находится в предварительном выпуске Connect.