Gems/AWSCore/Code/Source/ScriptCanvas/AWSScriptBehaviorLambda.cpp (94 lines of code) (raw):
/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include <AzCore/RTTI/BehaviorContext.h>
#include <AzCore/Serialization/EditContext.h>
#include <aws/lambda/LambdaClient.h>
#include <aws/lambda/model/InvokeRequest.h>
#include <aws/lambda/model/InvokeResult.h>
#include <aws/core/utils/Outcome.h>
#include <aws/core/auth/AWSCredentials.h>
#include <aws/core/utils/memory/stl/AWSStringStream.h>
#include <Framework/AWSApiRequestJob.h>
#include <ResourceMapping/AWSResourceMappingBus.h>
#include <ScriptCanvas/AWSScriptBehaviorLambda.h>
namespace AWSCore
{
void AWSScriptBehaviorLambda::Reflect(AZ::ReflectContext* context)
{
if (AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
{
serializeContext->Class<AWSScriptBehaviorLambda>()
->Version(0);
}
if (AZ::BehaviorContext* behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context))
{
behaviorContext->Class<AWSScriptBehaviorLambda>("AWSScriptBehaviorLambda")
->Attribute(AZ::Script::Attributes::Category, "AWSCore")
->Method("Invoke", &AWSScriptBehaviorLambda::Invoke,
{{{"Function Resource KeyName", "The resource key name of the lambda function in resource mapping config file."},
{"Payload", "The JSON that you want to provide to your Lambda function as input."}}})
->Method("InvokeRaw", &AWSScriptBehaviorLambda::InvokeRaw,
{{{"Function Name", "The name of the Lambda function, version, or alias."},
{"Payload", "The JSON that you want to provide to your Lambda function as input."},
{"Region Name", "The region of the lambda function located in."}}});
behaviorContext->EBus<AWSScriptBehaviorLambdaNotificationBus>("AWSLambdaBehaviorNotificationBus")
->Attribute(AZ::Script::Attributes::Category, "AWSCore")
->Handler<AWSScriptBehaviorLambdaNotificationBusHandler>();
}
}
void AWSScriptBehaviorLambda::Invoke(const AZStd::string& functionResourceKey, const AZStd::string& payload)
{
AZStd::string requestFunctionName = "";
AWSResourceMappingRequestBus::BroadcastResult(requestFunctionName, &AWSResourceMappingRequests::GetResourceNameId, functionResourceKey);
AZStd::string requestRegion = "";
AWSResourceMappingRequestBus::BroadcastResult(requestRegion, &AWSResourceMappingRequests::GetResourceRegion, functionResourceKey);
InvokeRaw(requestFunctionName, payload, requestRegion);
}
void AWSScriptBehaviorLambda::InvokeRaw(const AZStd::string& functionName, const AZStd::string& payload, const AZStd::string& region)
{
if (!ValidateInvokeRequest(functionName, region))
{
return;
}
using LambdaInvokeRequestJob = AWS_API_REQUEST_JOB(Lambda, Invoke);
LambdaInvokeRequestJob::Config config(LambdaInvokeRequestJob::GetDefaultConfig());
config.region = region.c_str();
auto job = LambdaInvokeRequestJob::Create(
[](LambdaInvokeRequestJob* job) // OnSuccess handler
{
Aws::IOStream& stream = job->result.GetPayload();
std::istreambuf_iterator<AZStd::string::value_type> eos;
AZStd::string content = AZStd::string{std::istreambuf_iterator<AZStd::string::value_type>(stream), eos};
AWSScriptBehaviorLambdaNotificationBus::Broadcast(
&AWSScriptBehaviorLambdaNotificationBus::Events::OnInvokeSuccess, content.c_str());
},
[](LambdaInvokeRequestJob* job) // OnError handler
{
Aws::String errorMessage = job->error.GetMessage();
AWSScriptBehaviorLambdaNotificationBus::Broadcast(
&AWSScriptBehaviorLambdaNotificationBus::Events::OnInvokeError, errorMessage.c_str());
},
&config);
std::shared_ptr<Aws::StringStream> stream = std::make_shared<Aws::StringStream>();
*stream << payload.c_str();
job->request.SetFunctionName(functionName.c_str());
job->request.SetBody(stream);
job->Start();
}
bool AWSScriptBehaviorLambda::ValidateInvokeRequest(const AZStd::string& functionName, const AZStd::string& region)
{
if (functionName.empty())
{
AZ_Warning("AWSScriptBehaviorLambda", false, "Request validation failed, bucket name is required.");
AWSScriptBehaviorLambdaNotificationBus::Broadcast(
&AWSScriptBehaviorLambdaNotificationBus::Events::OnInvokeError, "Request validation failed, function name is required.");
return false;
}
if (region.empty())
{
AZ_Warning("AWSScriptBehaviorLambda", false, "Request validation failed, region name is required.");
AWSScriptBehaviorLambdaNotificationBus::Broadcast(
&AWSScriptBehaviorLambdaNotificationBus::Events::OnInvokeError, "Request validation failed, region name is required.");
return false;
}
return true;
}
} // namespace AWSCore