| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- /*
- * 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
|