#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.