AWSKRUG 활동 목록

※AWS 강남 비기너 그룹에서 활동 하고 있습니다. 다양한 경험 접해보고 싶습니다.
AWSKRUG 슬랙[커뮤니케이션]
AWS 유저그룹 사이트
AWSKRUG Meetup
AWSKRUG Facebook

17년 4월 19~20일 AWS Summit 이 있습니다. 참가하시는 분들은 뵐 거 같네요~! 

AWS 슬랙 그룹 가입 하셔서 #gangnambeginner 채널에서 인사 부탁드려요
관련 행사 참석에 관심 있으신 분은 아래 달력 참고하시길 바래요~

Slack 가입 안되시는 분들은 링크 참고

AWSKRUG 이벤트 구글 캘린더

AWS SAA 합격 후기 도 필요하신 분 참고 바라요~

CloudFormation 시작하기

CloudFormation은 json 템플릿 형태를 가진다. CloudFormation은 Chef기반으로 사용하게 되면 설정한 대로 알아서 VPC 및 EC2 생성, Security Group 설정 등이 가능하다.

우선 템플릿 기본구조이다.

{
   "Description" : "이 곳에는 템플릿의 Description을 입력한다.",
   "Parameters": {
   // 스택을 생성할 때 사용자가 입력할 매개변수들이다.
   },
   "Resources" : {
   // AWS 리소스들의 설정 내용 그리고 리소스들간의 관계에 대해 정의할 수 있다.
   },
   "Outputs" : {
   // 스택을 생성 후 출력할 내용이다.
   },
   "AWSTemplateFormatVersion" : "2010-09-09"
}

EC2를 생성하고 EIP를 붙이는 작업을 해주는 템플릿은 아래를 참고한다.
https://s3-us-west-2.amazonaws.com/cloudformation-templates-us-west-2/EIP_With_Association.template

AWS 에서 제공하는 기본 템플릿 모음 문서 사이트

http://docs.aws.amazon.com/ko_kr/AWSCloudFormation/latest/UserGuide/sample-templates-services-us-west-2.html

  • AWS CloudFormer를 사용하면 현재 VPC 자원에 대해 자동으로 템플릿으로 생성해준다.
  • AWS CloudFormation Designer를 사용하면 조금 더 쉽게 접근할 수 있다.

CloudSearch vs ElasticSearch

AWS 에는 CloudSearch 와 ElasticSearch 서비스가 있다.
간혹 헛갈릴 수 있어 정리해 본다.

CloudSearch 소개

http://wildpup.cafe24.com/archives/1085

  • CloudSearch는 웹페이지를 크롤링하고 데이터화하여 해당 데이터를 바탕으로 검색하는 방식은 아니고 DynamoDB나 S3에 저장된 CSV로 저장된 데이터를 사용한다.
  • RDS의 경우 DataPipeLine을 이용하여 S3에 저장 후 사용이 가능하다. 하지만 TEXT 파일, PDF, HTML, JSON, XML도 검색 데이터 형식으로 쉽게 사용할 수 있는 장점을 가지고 있다.
  • S3 버킷 지정 후 인덱싱 설정하여 검색 할 수 있다.

===========================================================================

ElasticSearch 소개

http://wildpup.cafe24.com/archives/1184

  • ElasticSearch는 루씬 기반으로 루씬의 기능을 대부분 지원 (자바로 개발되었음).
  • 분산시스템 (여러 개의 노드[검색하는 단위 프로세스]로 구성)
  • 확장 시 기존 노드에 새 노드를 실행하여 연결
  • 각 노드에 데이터 분산 저장 (복사본 유지하여 충돌로부터 보호)
  • 높은 가용성 (실패할 경우 다른 노드로 이동)\
  • json으로 저장 (REST API 지원)
  • HTTP Method 지원 (9200번 포트부터)
  • 키바나와 연동되어 시각화 가능
  • AWS ElasticSearch는 생성 시 IAM 권한이 필요하고, Kibana접근 시 액세스 정책을 IP기반으로 열어줘야 함
    =====================================================

    {
     "Version": "2012-10-17",
     "Statement": [
      {
       "Sid": "",
       "Effect": "Allow",
       "Principal": {
       "AWS": "*"
       },
       "Action": "es:*",
       "Resource": "arn:aws:es:ap-southeast-2:167306399485:domain/example-170714/*",
       "Condition": {
        "IpAddress": {
         "aws:SourceIp": "211.3.22.111/32"
        }
       }
      }
     ]
    }

    =====================================================

AWS Codecommit 사용해보기

AWS Codecommit은 Github 대용으로 사용 가능하다. Private한 레포지토리가 필요할 때 유용할 것으로 보인다.

  1. Git은 기본적으로 설치해두고, 콘솔에 접속한다.  리포지토리를 만든다.

Codecommit 1.PNG

2.  IAM User를 생성하고 아래와 같이 권한을 준다. (KMS 권한은 초기에 필요하고 생성 후 제거 가능)
Codecommit 2

3.  Security credentials 에 들어가서 HTTPS Git 용 유저를 생성해준다 ~

Codecommit 3

4.  Code Commit에서 제공 해 준 HTTPS 링크를 git clone을 통해 시도한다.

5. 시도하게되면 유저와 비밀번호를 넣는 란이 있는데, 생성한 CodeCommit용 유저 정보를 입력한다.

6. 이제 git remote origin 만 설정해주면 정상적으로 git을 사용할 수 있다.
git remote add origin https://git-codecommit.ap-northeast-2.amazonaws.com/v~~~~~~

git init
git config --global user.email "kgb@kgb.co.kr"
git config --global user.name "kgb"
git add lala2.txt
git commit -m "this is kyu"
git remote add origin https://git-codecommit.ap-southeast-2.amazonaws.com/v1/repos/test-170724
git push -u origin master
git checkout -b newbranch (-d 삭제 )
git push origin newbranch
git checkout master
git merge newbranch

AWS – S3 파일 생성시 SNS, SQS를 통해 EC2로 전달

링크 : http://hochulshin.com/aws-s3-sns-sqs-event/

위 의 링크에서 EC2의 /root/test2.txt 에 S3 업로드 로그를 쓰기 위해 아래의 코드로 수정한다.


import threading
import time
import utils
import json
import subprocess

QUEUE_NAME = "QUEUE-NAME"
QUEUE_ATTR_NAME = "ApproximateNumberOfMessages"
SLEEP = 10

def Connect2sqs():
	#Connect to SQS service
	return utils.connect2Service('sqs')

#The SQSConsumer class retrieves messages from an SQS queue.
class SQSConsumer (threading.Thread):
	sqs = Connect2sqs()

	def __init__(self, threadID, name, counter):
		threading.Thread.__init__(self)
		self.threadID = threadID
		self.name = name
		self.counter = counter

	def run(self):
		print("SQSConsumer Thread running!")
		maxRetry = 10000 # MAXIMUM 10000 tries
		numMsgs = 0
		maxMsgs = self.getNumberOfMessages()
		count = 0
		print("No. of Messages to consume:", maxMsgs)
		while numMsgs < maxMsgs or count < maxRetry:
			time.sleep(SLEEP)
			numMsgs += self.consumeMessages()
			count += 1
			print("Iteration No.:", count, numMsgs)
		print("SQSConsumer Thread Stopped")
		
	def getQueue(self, sqsQueueName=QUEUE_NAME):
  #Get the SQS queue using the SQS resource object and QUEUE_NAME
		queue = None
		try:
			queue = self.sqs.get_queue_by_name(QueueName=sqsQueueName)
		except Exception as err:
			print("Error Message {0}".format(err))
		return queue

	def getNumberOfMessages(self):
		numMessages = 0
		try:
			queue = self.getQueue()
			if queue:				
			  # Receive messages from the SQS queue by using the receive_messages API method.
				# Enable long polling and set maximum number of messages to 10.
				attribs = queue.attributes
				numMessages = int(attribs.get(QUEUE_ATTR_NAME))
		except Exception as err:
			print("Error Message {0}".format(err))
		return numMessages

	def consumeMessages(self, sqsQueueName=QUEUE_NAME):
		numMsgs = 0
		try:
			queue = self.getQueue()
			if queue:
				mesgs =  queue.receive_messages(													
										AttributeNames=['All'], MaxNumberOfMessages=10, WaitTimeSeconds=20)
				if not len(mesgs):
					print("There are no messages in Queue to display")
					return numMsgs
				for mesg in mesgs:	 	
                                        f = open("/root/test2.txt", 'a')
					# Retrieve the Attributes of a message.
					attributes = mesg.attributes		
					senderId = attributes.get('SenderId')
					sentTimestamp = attributes.get('SentTimestamp')
					
					# !!!!!!!!Retrieve the body of a message.!!!!!!!!!!!!!!
					bd = mesg.body
                                        event = eval(bd)
                                        jsonmsg = json.loads(event['Message'])
                                        fileName = jsonmsg["Records"][0]["s3"]["object"]["key"]
                                        size = jsonmsg["Records"][0]["s3"]["object"]["size"]
                                        bucketName = jsonmsg["Records"][0]["s3"]["bucket"]["name"]
                                        print(fileName)
                                        print(size)
                                        print(bucketName)
                                        space=" \n"
                                        lala=fileName+" "+`size`+" "+bucketName+space
                                        f.write(lala)
                                        f.close()
					# !!!! The example of excution of bashscript!!!!
                                        #filePath = "/mnt/s3mount/" + fileName
                                        #subprocess.call(["./soma_aws.sh", filePath, "/mnt/s3output"])

        	# Delete Message from the SQS queue
					self.deleteMessage(queue, mesg)
					time.sleep(1)
				numMsgs = len(mesgs)
		except Exception as err:
			print("Error Message {0}".format(err))
		return numMsgs

	def deleteMessage(self, queue, mesg):
		try:
			#Delete Message from the SQS queue
			mesg.delete() 									
			print("Message deleted from Queue")
			return True
		except Exception as err:
			print("Error Message {0}".format(err))
		return False
	
def main():
	try:
		thread1 = SQSConsumer(1, "Thread-1", 1)
		thread1.start()
	except Exception as err:
		print("Error Message {0}".format(err))
	thread1.join()
	return thread1

if __name__ == '__main__':
	main()