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

У меня есть бессерверная функция внутри шаблона CloudFormation, предназначенная для создания экземпляра AWS Connect. Однако я не могу получить доступ к каким-либо методам объекта aws-sdk, возникает ошибка: «connect.createInstance не является функцией». Когда я вызываю getOwnPropertyNames для объекта, он возвращает следующее вместо методов, к которым я пытаюсь получить доступ: [ 'конфиг', 'isGlobalEndpoint', 'конечная точка', '_события', 'МОНИТОР_СОБЫТИЙ_БУББЛ', 'ЗВОНОК_СОБЫТИЙ_БУББЛЬ', '_originalConfig', '_ID клиента' ]

В качестве теста я создал экземпляр объекта 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.info(Object.getOwnPropertyNames(connect)); // ***Not what's expected***
        var createConnectRequest = connect.createInstance(params, function(err, data) {
          if (err) console.info(err, err.stack);
          else     console.info(data);
        }); // ***connect.createInstance is not a function***

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

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

jarmod 13.12.2020 23:08

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

user2774004 14.12.2020 00:07

Неверное предположение афаик.

jarmod 14.12.2020 00:35
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
198
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Эта функция была представлена ​​в v2.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');

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

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

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

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

user2774004 14.12.2020 00:45

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

user2774004 15.12.2020 15:49

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

jarmod 15.12.2020 16:08

Другие вопросы по теме