У меня есть бессерверная функция внутри шаблона 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}
Поскольку я явно закрепляю apiVersion, и при создании экземпляра этого объекта не возникает никаких ошибок, я ожидаю, что метод будет существовать, а документация, на которую я ссылаюсь, будет применяться: var connect = new AWS.Connect({apiVersion: '2017-08 -08'}); Если это неверное предположение, кто-нибудь, пожалуйста, отзовитесь.
Неверное предположение афаик.
Метод 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), чтобы получить доступ к этой функции.
Отличный ответ, большое спасибо и бонусные баллы за объяснение вашей методологии и ссылку на журнал изменений и решение.
В качестве побочного примечания кажется плохой практикой для API не выдавать ошибку, когда вы создаете экземпляр объекта с APIVersion, который он на самом деле не использует.
Он использует эту версию API и поддерживает Connect API. Проблема, с которой вы столкнулись, заключается в том, что createInstance находится в предварительной версии Connect.
Среда выполнения Node.js Lambda включает AWS SDK 2.771.0. Возможно, вы захотите проверить вне Lambda, поддерживает ли эта конкретная версия SDK метод createInstance Connect.