( 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을 별도 설정하여 사용할 서비스 생성 시 인자로 같이 넘겨주면 됩니다.

워낙 가끔 만지다보니 가끔 혼동이 와서 정리합니다.

 

Windows Server 2019 Standard ( 64bit ) , MSSQL Standard 2017( 64bit )

 

 

(1) 에 사용할 이름을 설정, (2)에 연결할 DB의 IP, PORT를 입력합니다. MSSQL 끼리 연결할 때 다른 설정은 굳이 입력하지 않아도 됩니다. 연결할 DB에서는 "보안" 항목에 입력할 계정에 필요한 권한이 설정되어 있을 것이므로 (입력된 것이 없다면 연결할 DB에 계정 생성, 필요한 사용 권한 설정을 해 두시면 됩니다.) 다른 설정은 필요없습니다. 카탈로그에 사용할 DB 이름을 넣을 수 있지만 사용 권한 설정에 필요한 정보가 다 있으므로 입력이 불필요합니다.

 

 

 

그리고 "보안" 페이지에서 원격 로그인, 암호를 입력한 후 "확인"을 누르면 설정이 종료됩니다. 

 

끝!!!

쉽다길래 별 생각 안했는데.. 설정할게 많네 -_-



ERROR. max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]

ERROR. memory locking requested for elasticsearch process but memory is not locked


위 두 에러가 발생하면 아래 내용을 참고하여 수정하면 된다.


클러스터를 구성하기 위해서는 리소스 사용에 대한 제한을 풀어줘야 한다. 


아래 command로 현재 리소스 제한 사항을 볼 수 있으며, 

ulimit -Sa


vi /etc/security/limits.conf


로 들어가서 아래와 같이 설정한다.


es-user hard memlock unlimited          >> 하드 세팅으로 메모리 락 제한 없도록 설정

es-user soft memlock unlimited           >> 소프트 세팅으로 메모리 락 제한 없도록 설정

es-user hard nofile 65536                   >> 하드 세팅으로 65536번의 파일을 열어 볼 수 있게 설정

es-user soft nofile 65536                    >> 소프트 세팅으로 65536번의 파일을 열어 볼 수 있게 설정

es-user hard nproc 65536                   >> 하드 세팅으로 65536번의 프로시저를 실행 할 수 있게 설정

es-user soft nproc 65536                    >> 소프트 세팅으로 65536번의 프로시저를 실행 할 수 있게 설정

(es-user는 Elasticsearch를 실행할 유저를 말한다. 사용중인 계정으로 수정하여 설정할 것!)

모든 설정이 끝나면 다시 시스템을 리붓한다. 



ERROR. max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]


하나의 프로세스가 가질 수 있는 메모리 맵 영역의 최대 수를 말하는데 아래와 같이 수정이 가능함.


sysctl -w vm.max_map_count=262144

(root 권한으로 실행)

재실행 없이 바로 적용됨. /etc/sysctl.conf에 추가하면 재부팅시 적용됨.


ERROR. failed to send join request to master ... 


network.bind_host, network.publish_host, network.host 세 가지 설정을 적절히 했는지 잘 살펴 볼 것!



config 파일에서 수정해야 할 내용들


config/jvm.options


메모리 관련된 설정인데 역할에 따라 다르다. 찾아보면 다양한 정보가 나오는데 아직 경험하지 못해서 이렇다 저렇다 적기가 뭐 하네. 일단 아래 두 가지를 적절히 수정. 해당 서버의 리소스에 맞춰 수정이 필요. 


-Xms 와 -Xmx 를 master는 2g , data는 4g로 수정해 봄.


-------------------------------------------------------------------------------------------------------------------


config/elasticsearch.yml


cluster.name: es-cluster             << 적절한 이름으로 설정. 클러스터마다 고유해야 함.


node.name: node-master           << 적절한 이름으로 설정. 노드마다 고유해야 함.

node.master : true                    << 마스터 노드인 경우 true 아니면 false

node.data: false                       << 데이터 전용 노드인 경우 true 아니면 false


bootstrap.memory_lock: true      <<  bootstrap 검사. 5버전부터 추가 된 듯. 주요 설정들이 잘못된 경우 상용 모드에서는 서버가 실행되지 않고, 개발 모드에서는 경고 메세지 출력 처리. memory_lock은 jvm 메모리의 swapping lock 여부를 확인한다. 


network.bind_host: 0.0.0.0         
network.publish_host: 1.1.1.1      << 설치된 서버의 IP
network.host: 1.1.1.1                

transport.tcp.compress: true       << node간 통신하는 데이터의 압축 여부를 설정.
transport.tcp.port: 9300             << node간 통신에 사용하는 포트

http.port: 9200                        << http를 통한 elasticsearch API 지원 노드의 port를 설정한다.

(각 포트는 별도 설정하지 않았는데 기본값을 사용한다고 가정한다. 필요하다면 http.port , transport.tcp.port 옵션을 수정하여 사용할 것!)
discovery.zen.minimum_master_nodes: 1  << 실제 서비스 환경에서는 최소 2대 이상의 마스터를 운영해야 한다.
discovery.zen.ping.unicast.hosts: ["1.1.1.1:9300"]     << node 간 연결을 위해 unicast로 master 노드를 지정하자. 마스터로 등록된 서버의 모든 ip를 기록해야 한다. 기본 포트인 9300을 사용한다면 굳이 기록할 필요는 없고, 포트를 변경한 경우만 이와 같이 기록하며 된다.

-------------------------------------------------------------------------------------------------------------------

이상 Elasticsearch Cluster 를 구성할 때 발생하는 에러 유형과 해결책, 그리고 config 설정 정보를 추가로 정리해 보았다.


  1. SSSS 2019.08.31 20:02

    감사합니다정말로

iis 서버에서는 mime에 정의되지 않은 확장자에는 접근할 수 없다.



iis 관리자에서 설정하고자 하는 사이트를 선택한다. 그리고 메뉴 중 MIME 형식을 클릭하여 관리창을 연다.




그리고 위처럼 추가하려는 확장자를 등록하고, 적절한 형식을 지정한다. 


이제 해당 주소로 접근하면 원하는 파일을 다운 받을 수 있다.




기본 id는 "pi", pw는 "raspberry".

--------------------------------

sd에 라즈비안 설치 시 기본 비번은 변경하는게 좋으며, 

초기 설정에서 놓쳤다면 이후 "raspi-config"를 입력하면 다시 설정할 수 있다.


보드에 전원 스위치가 없다.

--------------------------------

전원이 연결되면 바로 가동되는데, 종료시 전원을 바로 내리면 주변장치에 문제가 발생할 수 있다. ( sd카드와 같은.. )

" shutdown -h now " 커멘트를 통해 꼭 모든 디바이스가 unmount 된 이후 종료되도록 해줘야 한다.

재가동하려면 전원선을 뺐다가 다시 연결하니 되네. 이거 몰라서 한참 찾음.


SD 카드는 가능한 큰걸로

---------------------------------

http://www.raspberrypi.org/downloads 에서 os 이미지를 다운받아 http://sourceforge.net/projects/win32diskimager/ 유틸리티를 이용해 SD에 구워 사용하게 되며, 보통 이 sd를 통해 계속 운영하게 된다. 

GPIO용이 아닌 개발 device로 사용하려면 여러가지 라이브러리를 사용해야 하기 때문에 가능한 큰 용량의 sd로 시작하는게 좋다.


전원만 연결하면 원격으로 바로 사용할 수 있게 세팅하자.

---------------------------------

이를 위해 무선랜 설치, 자동 로그인 두가지 설정이 필요하다. 

아래 과정시 관리자 권한을 필요로 하기 때문에 sudo를 입력하거나 혹은 sudo su를 입력 후 아래 절차를 진행하자.


무선랜 설치

------------------------------------

공간활용을 위해 가능한 무선랜을 추천한다. 난 처음 구매시 netis 제품이 동봉되어 도착했다.

무선랜은 아래와 같은 순서로 설치하면 된다. (x-windows에서 설정은 간단하니 패스, 콘솔에서 설정하는 방법을 다룬다.)


1. 설치된 공유기에 접속 설정

nano /etc/wpa_supplicant/wpa_supplicant.conf 를 실행하면 아래와 같은 화면이 뜬다.



아래와 같이 입력하자. ssid와 psk는 각자 공유기의 설정에 따른 값을 입력해야 한다.



nano editor는 vi보다는 좀 더 사용하기 쉽다. 


문자열을 찾을 때는 ctrl+w 입력 후 찾고자 하는 문자를 입력하면 된다. 

ctrl+x를 입력하면 수정된 경우, overwrite할지 물어보고 Y를 입력하면 저장하고 종료된다.


2. nic(network interface card) 설정


nano /etc/network/interfaces 를 입력하고 해당 정보를 아래와 같이 수정한다.



이제 설정은 모두 마무리 되었다. 아래와 같이 무선 인터넷을 재시작해보자.


ifdown wlan0

ifup wlan0


만약 에러가 발생한다면 해당 메세지에 따라 수정이 필요할 수 있다. 잘 안된다면 전체 오류 메세지를 댓글로 달아주면 확인 후 답변 할지도 ^^;;;


재시작되면 ifconfig 명령으로 할당된 ip를 확인할 수 있다. 이제 자동 로그인 되도록 해보자.


2. 자동 로그인 설정


nano /etc/inittab 를 입력해 시스템 기동시 처리되는 내용이 기록된 파일을 연다.


각 런레벨별로 실행하는 정보 라인을 찾아보자. 


1:2345:respawn:/sbin/getty --noclear 38400 tty1  => 이와 유사한 라인을 찾아볼 수 있다. ctrl+w로 noclear를 검색해서 찾아보자.


이를 주석 처리하고 (문장 제일 앞에 #을 붙이면 된다.), 아래 라인을 입력하자.


1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 > /dev/tty1 2>&1


위 문장의 상세한 설명은 생략한다. -0-a

이제 시스템을 재시작해보면 자동으로 로그인 되는 모습을 볼 수 있다.


'개발 이야기 > RaspberryPi' 카테고리의 다른 글

버튼으로 LED, Sound 처리하기  (0) 2015.05.01
blink 샘플 실행  (0) 2015.04.29
기본적이지만 중요 정보 몇가지  (0) 2015.04.18
드디어 왔다!!  (0) 2015.04.17

아파치(apache2.4.x)를 오랜만에 건드리는데 왜케 많이 변한거지 --;


아래는 gitweb과 연동하는 과정에서 perl 설정을 추가한 부분.


Alias /gitweb /usr/share/testWeb


<IfModule mod_perl.c>

<Directory /usr/share/testWeb>

   Options +ExecCGI

   AddHandler perl-script .cgi .pl

   PerlResponseHandler ModPerl::Registry

   PerlOptions +ParseHeaders

   AllowOverride None

    Require all granted

    AuthType Basic

    AuthName "Git Access"

    Require valid-user

    AuthUserFile /etc/apache2/gitweb-htpasswd

    SetEnv GITWEB_CONFIG /etc/gitweb.conf

</Directory>

</IfModule>


추가로 gitweb.conf 파일 내용도 업데이트.

our $projectroot = "/home/git/repositories/";


# directory to use for temp files

our $git_temp = "/tmp";


# target of the home link on top of all pages

#$home_link = $my_uri || "/";


# html text to include at home page

#$home_text = "indextext.html";


# file with project list; by default, simply scan the projectroot dir.

our $projects_list = "/home/git/projects.list";


# stylesheet to use

#@stylesheets = ("static/gitweb.css");


# javascript code for gitweb

#$javascript = "static/gitweb.js";


# logo to use

#$logo = "static/git-logo.png";


# the 'favicon'

#$favicon = "static/git-favicon.png";


# git-diff-tree(1) options to use for generated patches

#@diff_opts = ("-M");

@diff_opts = ();


$feature{'blame'}{'default'} = [1];



+ Recent posts