디아2 레저렉션 서버다운 공지를 번역해봤습니다.

디아2: 레저렉션, 서버도 터지고 아이템도 날아가고…

디아2 레저렉션 서버가 터졌습니다.

그냥 터지고 게임만 못하면 그나마 다행인데, 몇몇 유저의 게임 진행 내용이 사라졌습니다. 과거 시점으로 롤백 되어버린거죠. 아니 이게 실화인가 싶었는데 와우 유저들에게는 종종 있었던 일이라네요. (그게 더 놀랍네요) 백섭 이라는 용어가 있더군요… https://namu.wiki/w/롤백?from=백섭

다행히 저는 지난 주말에 택배사가 일을 안해서 컴퓨터를 못맞췄고… 게임을 진행하지 않아 백섭 당하지 않았습니다. 여튼 서버가 터지고, 그 시간에 득템을 한사람들, 심지어 득템한걸 거래한 사람들은… 이후에 좋은 템 주우실 거에요… 저도 어제 좀 해봤는데, 기분 탓인지 블쟈가 미안하다고 잠시 템 드랍률을 올린건지… 템이 잘 뜨더라구요.

여튼, 도대체 디아블로2 레저렉션 서버가 어떻길래 이런일이 가능한거지? 싶어서 궁금해하던 차에… 블쟈에서 무슨일이 벌어졌던건지 글을 내놓았습니다.

https://us.forums.blizzard.com/en/d2r/t/diablo-ii-resurrected-outages-an-explanation-how-we’ve-been-working-on-it-and-how-we’re-moving-forward/28164

(포스트 추천) next.js 로그인 패턴 (feat. HOC)

Next.js 에서 private route 구현하는 방법 - https://dev.to/shubhamverma18/implement-protected-routes-in-nextjs-37ml

항상 프레임워크 공부 중에 로그인 단계에서 한번씩 고비를 맛본다.
어떤 프레임워크든, 클라우드 서비스든, 소프트웨어든 처음에 공부할때는 거의 무조건 공식홈페이지를 이용하는 편이다. (공식홈페이지 기초자료가 구리면 공부를 안하게되는건 함정)

next.js 를 사용해서 새로운 토이프로젝트를 작업중인데 로그인 패턴을 어떻게해야 하는지 공식홈페이지에서 좀 애매하게 써놓았다.
next.js가 많은 기능을 제공하고 특히 SSR, CSR을 구분하고 이 구분을 간편하게 구현할 수 있게 해놓은건 좋지만, 토이프로젝트라 나는 그냥 csr만 쭉 됐으면 좋겠고 ssr은 되도록이면 피하고 싶은데 자꾸 ssr을 슬쩍 끼워넣는다.

나는 react를 되도록이면 가볍게 쓰고 싶다. 특히 프론트를 php+apache 서버처럼 쓰고 싶지는 않은데… 뭔가 점점 그렇게 되가는 듯한… 그럴거면 그냥 php를 쓰는게 낫지 않나?

그래서 고민하고 삽질하고 뒤져보던 차에… 역시 잘해놓은 글이 있었다. 위 글에서 소개해주는 패턴은

  • HOC을 이용한 패턴이라 로그인이 필요한 page를 그냥 저렇게 withAuth로 감싸놓기만 하면 끝.
  • 굳이 복잡하게 getIninitialProps 등 안 써도되서 좋다.
  • 심지어 authToken verify를 안 하는방법/하는방법 나눠 놓아서 너무 좋다.

Rust 공부중

오픈소스 컨트리뷰션 아카데미에 멘티로 등록했다. gluesql 이라는 프로젝트에 지원했는데 이 프로젝트가 rust로 되어있어 rust를 공부중.

  • https://rinthel.github.io/rust-lang-book-ko/ 이 사이트에서 공부중.
  • 요새 계속 스크립트 언어(js, python)등을 사용하다가 컴파일 언어를 쓰니 기분이 새롭다
  • cargo로 빌드, 의존성관리
  • fn main() {} 를 보니 C 처음 배울 때가 생각난다
  • 기능이 추가된 C 랄까…
  • 기본적으로 let은 불변, let mut 선언을 통해 가변형으로 선언 가능
  • shadowing 으로 같은이름의 타입을 덮는건 가능. (재선언?하는 느낌)
  • 타입은 대충 다른언어들이랑 비슷
  • 매개변수/전달인자: parameter, argument
  • 구문/ 표현식: 구문은 값을 반환하지 않음, 표현식에는 ;을 붙이지 않음

Elasticsearch Update API로 Document 교체하기

Elasticsearch 는 기본적으로 Update API를 통해 요청하면 요청한 필드만 딱 업데이트한다.

그런데 종종 문서를 교체해야하는 일이 있다. update문서를 보면 문서의 Replace를 원하는 경우 Index API를 이용하라고 가이드 되어있다.

To fully replace an existing document, use the index API. update 문서참고

하지만 Index API는 만약 기존 문서가 존재하지 않으면 새로 생성해버리는 문제가 있다. 만약 기존 문서의 교체 만을 원한 것이라면 이게 문제가 된다. 기존 문서 교체를 원해서 index api를 날렸는데 실수로 id를 다르게 적었다면, 내가 교체하려는 문서는 그대로 있고 새로운 id에 문서가 생성되는 상황이 발생한다.

endpoint 설정 없이 사설 ip로 S3 접근하기 (feat. hosts 파일)

S3 interface endpoint 출시

S3 endpoint service 에 드디어 interface endpoint가 나왔다.

AWS S3 public 서비스라던데… 혹시 VPC에서는 사설통신이 되나요?

네 됩니다.

AWS에는 Private Link 혹은 VPC Endpoint 라고 불리는 서비스가 있다. 이름에서 알 수 있듯이 AWS의 서비스를 뭔가 Private 하게 쓸수 있게 해주는 기능이다. 여기에는 Interface Endpoint, Gateway Endpoint 두가지 타입이 있는데 S3는 그 동안엔
gateway endpoint 만 제공했다. 사실 모든 서비스가 둘중 하나의 타입으로만 제공했다. 예를들어 SQS 나 DynamoDB 같은 경우엔 Gateway 타입으로만 제공이 됐고 나머지는 Interface 타입으로만 제공이 됐다. gateway endpoint는 VPC 내에서는 어플리케이션에서 엔드포인트 변경등이 필요없이 바로 적용이 되는 장점이 있지만 ip가 제공되지 않는다는 단점이 있다.

EMR 6 버전 출시 (Hadoop 3.0, Hive LLAP, Spark3.0 지원)

아주 오랜만의 포스팅.

EMR 6.0

너무 늦은감이 있지만 EMR 6버전이 새로 출시되었다.

찾아보니 올해 4월에 출시가 되었는데… 무려 7개월만이다.
(https://aws.amazon.com/ko/about-aws/whats-new/2020/04/amazon-emr-announces-emr-release-6-with-new-major-versions-hadoop-hive-hbase-amazon-linux-2-docker/)

RDS, DocumentDB 는 Readreplica 생성시 다운타임이 발생하나요?

TL;DR

  • RDS의 경우 single-az에 스냅샷을 한번도 생성한적이 없으면 I/O 지연이 발생할 수 있음
  • Aurora, Document DB 는 공유스토리지 덕분에 single instance인 경우에도 순단이 발생하지 않음.

Amazon Linux 2에 Airflow 설치하기

당연히 쉽게 될줄 알았던 airflow 설치에 꽤 애를 먹었다. 구글링을 해봐도 명확한 가이드가 나오질 않아서 내가 성공한 설치 방법을 공유한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
# 의존성 설치 (가이드 상에는 python3, gcc, gcc-c++ 정도만 설치하면 된다는데 그렇게만 하면 자꾸 에러가 난다. gcc를 실행을 못한다든지...)
$ sudo yum update -y
$ sudo yum install group "Development tools" -y
$ sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel python3-devel.x86_64 cyrus-sasl-devel.x86_64 -y
$ sudo yum install libevent-devel -y

# 드디어 airflow를 설치. 여기에서 sudo를 생략하면 권한문제가 발생한다.
$ sudo pip3 install apache-airflow

# 위의 과정을 마쳤으면 여기서부터는 공식 가이드 그대로.
$ airflow initdb
$ nohup airflow webserver -p 8080 > webserver.out &
$ nohup airflow scheduler > scheduler.out

다른 OS에서는 확인을 못해봤고 Amazon Linux2가 올라간 EC2에서는 정상적으로 작동된다. (2020.1.8 기준)

Bastion Host를 통해 내부 서버에 SSH 접속하기 (터널링)

aws 상에서 보안을 위해 그림과 같이 실제 사용하는 인스턴스는 private subnet에 숨기고, public에 bastion host 라는 걸 둬서 접근하는 방식이 있다.

이렇게 하면 관리할 구멍을 하나만 만들고 그 외에는 접근이 원천적으로 불가능해지기 때문에 보안적으로는 좋아지긴 하는데… 그 내부로 접근하기가 매우 귀찮아지는 단점이 있다.

결국 private subnet 안에 있는 인스턴스에 접근하려면 배스쳔호스트를 거쳐야 하는데,
매번 그 명령어를 까먹어서 기록해둔다.

방법은 아래와 같다


1.타겟의 22번 포트를 배스천호스트를 통해 로컬(내컴퓨터)의 33322 포트로 포워딩

포트 포워딩
1
ssh -i "bastion-host-key.pem" -N -L 33322:{target-private-ip}:22 ec2-user@{bastion-host-public-ip}

(주의) 새 터미널을 띄운 후

2.로컬호스트의 33322포트를 이용해 타겟으로 접속

접속
1
ssh -i "target-key.pem" -p 33322 {target-user(대체로 ec2-user)}@localhost

타겟의 22번 포트를 배스천호스트를 통해 로컬(내컴퓨터)의 33322 포트로 포워딩

(용어정리)

  • bastion-host-key.pem: bastion host에 접근할 수 있는 key,
  • target-private-ip: 최종 접속할 인스턴스의 프라이빗 ip,
  • target-key.pem: bastion host의 key,
  • bastion-host-public-ip: 말 그대로 bastion host의 퍼블릭 ip

33322포트는 임의로 정한것이며 아무거나 남는 포트를 정하면 된다.
끝.

문제 해결: Cannot Call methods on a stopped SparkContext

스파크로 이것저것 테스트해보기 위해 zeppelin을 사용하는데 갑자기 이런 에러가 발생했다.

java.lang.IllegalStateException: Cannot call methods on a stopped SparkContext.

즉, 지금 사용하려는 SparkContext가 이미 종료되었다는 것이다.

이걸 구글에 검색해도 ‘로그를 봐라’ 라는 식의 원론적인 답변이 나와서 헤매다가 해결방법이 떠올랐는데…

해결 방법

그냥 스파크 인터프리터를 재시작하면 된다.

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×