Oh my goodless 입니다. 정말로.. 

 

감동이네요. 감사합니다. :)

 

해당 글 링크는 여기로 .. :)

( Windows 10 / VisualStudio 2017 환경에서 테스트 되었습니다. )

 

우선 AWS Console에서 필요한 계정과 SQS 설정을 해보겠습니다. 이미 계정 생성과 SQS 설정이 되어 있다면 다음으로 건너띄시기 바랍니다. 

 

여기서는 sqs_tester로 만들어 보겠습니다.

 

권한은 쓰기, 읽기를 분리해도 되고, 테스트를 위해 생성한다면 AmazonSQSFullAccess로 적용해도 괜찮습니다.

이제 SQS를 세팅해 보겠습니다.

FIFO 대기열로 생성해 보겠습니다. 구성은 기본 상태로 진행하겠습니다. 아.. 대기열 이름 끝은 ".fifo"로 끝내야 하니 주의하세요. 그리고 초당 300개의 메세지를 처리할 수 있다고 하니 실제 사용하실 때는 이런 제한사항을 꼭 확인 후 사용하시기 바랍니다.

 

큐가 생성되었다면 이제 접근을 위한 권한을 생성해 보겠습니다. 생성된 큐를 선택하고 하단에서 "권한"탭을 선택합니다.

프린시펄에서는 iam에서 생성한 사용자 ARN을 추가합니다. 그리고 하단의 작업에서 허용할 권한을 선택합니다.

 

아래에는 보내기 위해 필요한 권한과 메세지를 가져오는 측의 권한을 별도 계정에 할당한 결과입니다.

 

이제 AWS 설정 과정은 모두 마무리 되었습니다. 이제 실제 메세지를 보내는 cpp 코드를 만들어 보겠습니다.

 

우선 필요한 package를 NuGet으로 설치하세요.

 

필요한 패키지는 core와 sqs만 있으면 됩니다.

설치 시 자신의 프로젝트를 선택하면 lib include 에 대한 내용은 자동으로 세팅됩니다.

 

리눅스 계열에서는 aws cpp sdk를 git clone 혹은 별도로 다운받아 설치하시면 됩니다. cmake 시 BUILDONLY 옵션으로 core와 sqs만 지정해서 빌드하시는게 빠릅니다. 전체 설치했다가는 ... -_-a

 

이제 main.cpp를 프로젝트에 추가하고 아래 코드를 붙여 넣어보겠습니다. 

#include <aws/core/Aws.h>
#include <aws/core/auth/AWSCredentialsProvider.h>
#include <aws/sqs/SQSClient.h>
#include <aws/sqs/model/SendMessageRequest.h>
#include <aws/sqs/model/SendMessageResult.h>
#include <iostream>

int main(int argc, char** argv)
{
	Aws::SDKOptions options;
	Aws::InitAPI(options);

	Aws::Client::ClientConfiguration clientConfig;
	clientConfig.region = "ap-northeast-2";

	{
		Aws::String queue_url = "https://sqs.ap-northeast-2.amazonaws.com/111111111/sqs_test.fifo" ;
		Aws::String msg_body = "{\"key\":\"your_key\", \"value\":\"your_message\", \"ip\":\"162.158.186.95\"}";
		Aws::String msg_group_id = "msg_group_name_text";

		Aws::SQS::SQSClient sqs(Aws::Auth::AWSCredentials("your_access_key", "your_secret_key"), clientConfig);

		Aws::SQS::Model::SendMessageRequest sm_req;
		sm_req.SetQueueUrl(queue_url);
		sm_req.SetMessageGroupId(msg_group_id);
		sm_req.SetMessageBody(msg_body);
		sm_req.SetMessageDeduplicationId("unique_value_for_deduplication");	

		auto sm_out = sqs.SendMessage(sm_req);
		if (sm_out.IsSuccess())
		{
			std::cout << "Successfully sent message to " << queue_url <<
				std::endl;
		}
		else
		{
			std::cout << "Error sending message to " << queue_url << ": " <<
				sm_out.GetError().GetMessage() << std::endl;
		}
	}


	Aws::ShutdownAPI(options);
	system("PAUSE");

	return 0;
}

https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/examples-sqs-messages.html 의 샘플 코드에 인증, 지역설정을 추가했습니다. 

 

그리고 FIFO 대기열을 위해 DeduplicationId를 추가했습니다. 이는 FIFO에서 중복된 메세지가 기록되지 않도록 하기 위한 값으로 일정 시간 안에는 유니크해야 합니다. 기록된 메세지가 이미 사라졌거나 같은 값이 존재하더라도 10분(?? 정확한 수치는 공식 문서에서 찾지 못했습니다.) 정도 지나면 중복된 값이 나오더라도 기록됩니다. 

 

만약 중복될 경우에도 메세지를 보내는 어플리케이션에서는 메세지가 정상적으로 보내졌다고 판단되고, FIFO 대기열에서는 DeduplicationID 를 체크해서 중복으로 보내진 내용은 대기열에 추가하지 않습니다. 

 

코드 설명은 짧고 간단해서 별도 추가 설명은 필요 없을 듯 하네요. 혹시 궁금한 점이 있으면 댓글로 남겨주세요.

 

 

java 사용할 때는 credential 파일과 config 파일을 자신 계정 루트에 .aws 폴더 만들어서 넣으면 되는데... 

 

cpp sdk에서는 region 정보가 담긴 config파일을 사용하지 않습니다.

 

https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/credentials.html

(* cpp sdk에서 credential 설정하는 방법)

 

Aws::SDKOptions options;
Aws::InitAPI(options);

Aws::Client::ClientConfiguration clientConfig;
clientConfig.region = "ap-northeast-2";
.
.
.

Aws::SQS::SQSClient sqs(clientConfig);
.
.
.

위의 샘플 코드처럼 clientconfiguration을 별도 설정하여 사용할 서비스 생성 시 인자로 같이 넘겨주면 됩니다.

빌드 에러가 다음과 같은 경우...

 

/**


CommandInvokationFailure: Gradle build failed. 

...

...


stderr[


FAILURE: Build failed with an exception.


* What went wrong:

A problem occurred configuring root project 'gradleOut'.

> Failed to install the following Android SDK packages as some licences have not been accepted.

     build-tools;28.0.2 Android SDK Build-Tools 28.0.2

  To build this project, accept the SDK license agreements and install the missing components using the Android Studio SDK Manager.

  Alternatively, to transfer the license agreements from one workstation to another, see http://d.android.com/r/studio-ui/export-licenses.html

  

  Using Android SDK: somewhere... 


* Try:

Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.


* Get more help at https://help.gradle.org


BUILD FAILED in 1s

]

stdout[

WARNING: The specified Android SDK Build Tools version (28.0.0) is ignored, as it is below the minimum supported version (28.0.2) for Android Gradle Plugin 3.2.0.

Android SDK Build Tools 28.0.2 will be used.

To suppress this warning, remove "buildToolsVersion '28.0.0'" from your build.gradle file, as each version of the Android Gradle Plugin now has a default version of the build tools.

...

...

Warning: License for package Android SDK Build-Tools 28.0.2 not accepted.

]

exit code: 1

...

...



**/


볼드체로 된 부분을 참고.


이런 에러가 나면 google play licensing library가 잘 설정되어 있는지 확인해야 한다. 


지원하는 안드로이드 버전에 따라 rev 2 이전의 라이브러리가 필요하기도 하다. 


나도 이번에 1  버전이 설치가 되어 있지 않아 계속 위와 같은 에러가 발생. 


라이브러리 1을 재설치 후 정상 빌드가 되는 것을 확인했다.





Facebook Unity SDK 6.0 을 받아 패키지를 설치하고, 샘플을 돌려보는데 아래와 같은 에러가 발생


Could not securely load assembly from 

https://integrated-plugin-canvas-rsrc.fbsbx.com/rsrc/unity/lib/sdk_6.0/CanvasFacebook.dll


FB.cs 파일 line 411에 전처리기 "#if UNITY_4_5" 를 찾아 그 뒤에 " || UNITY_4_6 || UNITY_5_0 || UNITY_5" 를 붙여줄 것! 현재 버전 define만 붙여도 됨.




http://forum.unity3d.com/threads/facebook-sdk-assembly-cannot-be-loaded.264126/


커뮤니티에서 해결책을 찾았는데, 불편하게 개발자가 꼭 수정해야 되나 --; 


배포 버전 수정해서 올려주면 좋을텐데 --

+ Recent posts