μ•ˆλ…•ν•˜μ„Έμš” Mambo μž…λ‹ˆλ‹€.

μ˜€λŠ˜μ€ λ‘œλ“œλ°ΈλŸ°μ„œλ₯Ό ν™œμš©ν•œ TLS μ˜€ν”„λ‘œλ“œμ— λŒ€ν•΄μ„œ μ •λ¦¬ν•΄λ³΄κ³ μž ν•©λ‹ˆλ‹€. μ§€λ‚œ SSL μΈμ¦μ„œμ—μ„œλŠ” HTTPSλ₯Ό μ›Ή μ„œλΉ„μŠ€μ— μ μš©ν•˜λŠ” μ΄μœ μ™€ ν•¨κ»˜ SSL μΈμ¦μ„œλ₯Ό λ°œκΈ‰ν•˜κ³  TLS ν•Έλ“œμ‰μ΄ν¬λ₯Ό μ–΄λ–€ λ°©μ‹μœΌλ‘œ μˆ˜ν–‰ν•˜λŠ”μ§€λ₯Ό ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€. 이 κΈ€μ—μ„œλŠ” μ•„λ§ˆμ‘΄ μ›Ή μ„œλΉ„μŠ€μ˜ ELB(Elastic Load Balancing)μ—μ„œ μ§€μ›ν•˜λŠ” TLS ν•Έλ“œμ‰μ΄ν¬ 및 TLS μ˜€ν”„λ‘œλ”© κΈ°λŠ₯에 λŒ€ν•΄ μ•Œμ•„λ³΄κ³  μ°Έκ³ ν•΄μ•Όν•  정보λ₯Ό μ†Œκ°œν•©λ‹ˆλ‹€.

SSL μ˜€ν”„λ‘œλ“œ

TLS(SSL) μ˜€ν”„λ‘œλ“œλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„μ—μ„œ TLS ν•Έλ“œμ‰μ΄ν¬λ₯Ό μˆ˜ν–‰ν•˜μ§€ μ•Šκ³  νŠΈλž˜ν”½μ΄ μ „λ‹¬λ˜κΈ° μ „ λ‘œλ“œλ°ΈλŸ°μ„œμ—μ„œ SSL μΈμ¦μ„œλ₯Ό κ΄€λ¦¬ν•˜κ³  TLS ν•Έλ“œμ‰μ΄ν¬λ₯Ό μˆ˜ν–‰ν•˜λŠ” 것을 λ§ν•©λ‹ˆλ‹€. λŒ€λΆ€λΆ„μ˜ μ›Ή μ„œλΉ„μŠ€λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„λ₯Ό λ…λ¦½μ μœΌλ‘œ μš΄μš©ν•˜μ§€ μ•Šκ³  νŠΈλž˜ν”½ 규λͺ¨μ— 따라 μœ μ—°ν•˜κ²Œ ν™•μž₯ν•˜κ³  ν™•μž₯된 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„μ— νŠΈλž˜ν”½μ„ κ· λ“±ν•˜κ²Œ λΆ„μ‚°μ‹œν‚€κΈ° μœ„ν•˜μ—¬ λ‘œλ“œλ°ΈλŸ°μ„œλ₯Ό κ΅¬μ„±ν•©λ‹ˆλ‹€. μ•„λ§ˆμ‘΄ μ›Ή μ„œλΉ„μŠ€μ˜ ELB λ‘œλ“œλ°ΈλŸ°μ„œ μœ ν˜• 쀑 NLB와 ALBλŠ” SSL μΈμ¦μ„œλ₯Ό λ“±λ‘ν•˜κ³  ν΄λΌμ΄μ–ΈνŠΈμ™€ TLS ν•Έλ“œμ‰μ΄ν¬λ₯Ό μˆ˜ν–‰ν•˜μ—¬ νŠΈλž˜ν”½μ΄ EC2 μΈμŠ€ν„΄μŠ€ λ˜λŠ” μ»¨ν…Œμ΄λ„ˆλ‘œ μ „λ‹¬ν•˜λŠ” TLS μ˜€ν”„λ‘œλ”© κΈ°λŠ₯을 μ§€μ›ν•©λ‹ˆλ‹€.

Mutual TLS

μ›Ή μ„œλΉ„μŠ€μ˜ μš”κ΅¬μ‚¬ν•­μ— 따라 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„μ—μ„œλŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ X.509 μΈμ¦μ„œλ₯Ό ν† λŒ€λ‘œ μ‚¬μš©μž 인증을 μˆ˜ν–‰ν•˜κ³  μš”μ²­μ„ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„ λͺ¨λ‘ μΈμ¦μ„œλ₯Ό μ „λ‹¬ν•˜λŠ” 것을 Mutual TLS라고 ν•©λ‹ˆλ‹€. 그리고 μžλ°” 기반의 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„λŠ” javax.servlet.request.X509Certificate 속성을 톡해 X.509 μΈμ¦μ„œλ₯Ό κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ μ›Ή μš”μ²­μ΄ λ‘œλ“œλ°ΈλŸ°μ„œμ— μ˜ν•΄ νŠΈλž˜ν”½μ΄ μ „λ‹¬λ˜λŠ” 경우 ν΄λΌμ΄μ–ΈνŠΈ μΈμ¦μ„œλ₯Ό ν¬ν•¨ν•˜μ—¬ μ „λ‹¬ν•˜λŠ” 것이 보μž₯λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 일반적으둜 Nginxλ₯Ό λ‘œλ“œλ°ΈλŸ°μ„œλ₯Ό μ‚¬μš©ν•˜λŠ” κ²½μš°μ—λŠ” μš”μ²­ μ‹œ ν¬ν•¨λœ ν΄λΌμ΄μ–ΈνŠΈμ˜ μΈμ¦μ„œ 정보가 X-SSL-CERT와 같은 λΉ„ν‘œμ€€ ν—€λ”λ‘œ 전달될 수 μžˆλ„λ‘ μ„€μ •ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ μš”μ²­ ν—€λ”λ‘œ μΈμ¦μ„œλ₯Ό μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„κΉŒμ§€ μ „λ‹¬ν•˜λŠ” 것은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈμ˜ μ‹€μ œ 아이피λ₯Ό μ•ŒκΈ° μœ„ν•˜μ—¬ μ‚¬μš©λ˜λŠ” ν‘œμ€€ 헀더 X-Forwarded-For와 λΉ„μŠ·ν•œ λͺ©μ μœΌλ‘œ μ‚¬μš©λœλ‹€κ³  λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

AWS NLB

μ•„λ§ˆμ‘΄ μ›Ή μ„œλΉ„μŠ€μ˜ NLB(Network Load Balancer)λŠ” L4 레벨의 ELB λ‘œλ“œλ°ΈλŸ°μ„œ μœ ν˜•μž…λ‹ˆλ‹€. NLBλŠ” L4 λ ˆλ²¨μ—μ„œ λ‘œλ“œλ°ΈλŸ°μ‹±μ„ μˆ˜ν–‰ν•˜λ©° ν”„λ‘œν† μ½œκ³Ό 포트λ₯Ό 기반으둜 μ§€μ •λœ ν•˜λ‚˜ μ΄μƒμ˜ λŒ€μƒ 그룹으둜 μš”μ²­μ„ μ „λ‹¬ν•˜κΈ° λ•Œλ¬Έμ— λŒ€κ·œλͺ¨ νŠΈλž˜ν”½μ„ λΉ λ₯΄κ²Œ EC2 μΈμŠ€ν„΄μŠ€λ‘œ μ „λ‹¬λ˜λ„λ‘ μ§€μ›ν•©λ‹ˆλ‹€.

ELB의 λ‘œλ“œλ°ΈλŸ°μ„œ μœ ν˜• λΉ„κ΅μ—μ„œ λ‚˜μ™€μžˆλ“―μ΄ NLBλŠ” TLS μ˜€ν”„λ‘œλ“œλ₯Ό μ§€μ›ν•˜κΈ° λ•Œλ¬Έμ— λ‘œλ“œλ°ΈλŸ°μ„œμ— μΈμ¦μ„œλ₯Ό λ“±λ‘ν•˜κ³  TLS ν•Έλ“œμ‰μ΄ν¬λ₯Ό μ²˜λ¦¬ν•˜λ„λ‘ ꡬ성할 수 있게 λ©λ‹ˆλ‹€. λ‹€μŒκ³Ό 같이 NLB의 λ¦¬μŠ€λ„ˆ μ„€μ • μ‹œ TLS ν”„λ‘œν† μ½œμ„ μ„ νƒν•˜κ³  TLS 버전과 μ•”ν˜Έν™” μŠ€μœ„νŠΈ λͺ©λ‘μ— λŒ€ν•œ λ³΄μ•ˆ μ •μ±… 그리고 SSL μΈμ¦μ„œλ₯Ό 등둝할 수 μžˆμŠ΅λ‹ˆλ‹€.

ECC μΈμ¦μ„œ 미지원

TLS μ˜€ν”„λ‘œλ“œλ₯Ό μ§€μ›ν•œλ‹€κ³  λ‚˜μ™€μžˆμ§€λ§Œ λͺ¨λ“  SSL μΈμ¦μ„œλ₯Ό μ§€μ›ν•˜λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. νšŒμ‚¬μ—μ„œ μ‚¬μš©μ€‘μΈ μΈμ¦μ„œμ™€ 같은 타원 κ³‘μ„ ν˜• ν‚€λ₯Ό μ‚¬μš©ν•˜λŠ” ECC μΈμ¦μ„œλ₯Ό λ“±λ‘ν•˜κ²Œ 되면 μ•„λ§ˆμ‘΄ μ›Ή μ„œλΉ„μŠ€λ‘œλΆ€ν„° μ•Œλ¦Όμ„ λ°›κ²Œλ˜κ³  μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„λ‘œ νŠΈλž˜ν”½μ΄ μ „λ‹¬λ˜μ§€ μ•ŠλŠ” μƒνƒœκ°€ 될 수 μžˆμŠ΅λ‹ˆλ‹€.

NLB에 λŒ€ν•œ λ¦¬μŠ€λ„ˆ μ„€μ • λ¬Έμ„œλ₯Ό μ‚΄νŽ΄λ³΄λ©΄ 2048 μ΄μƒμ˜ λΉ„νŠΈλ₯Ό μ‚¬μš©ν•˜λŠ” RSA ν‚€ λ˜λŠ” EC ν‚€λ‘œλœ μΈμ¦μ„œλ₯Ό μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€λΌκ³  κ²½κ³ ν•˜κ³  있으며 λ¬Έμ„œλ₯Ό μ‚΄νŽ΄λ³΄κΈ°κΉŒμ§€ μ΄λŸ¬ν•œ 정보λ₯Ό 확인할 수 μžˆλŠ” 곳은 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.

μ˜μ™Έλ‘œ 많이 μ‚¬μš©ν•˜κ³  μžˆλŠ” ECC μΈμ¦μ„œμ— λŒ€ν•΄μ„œλŠ” NLBμ—μ„œ TLS μ˜€ν”„λ‘œλ“œλ₯Ό μˆ˜ν–‰ν•  수 μ—†κΈ° λ•Œλ¬Έμ— μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„μ—μ„œ SSL μΈμ¦μ„œλ₯Ό κ΄€λ¦¬ν•˜κ³  TLS ν•Έλ“œμ‰μ΄ν¬λ₯Ό μˆ˜ν–‰ν•΄μ•Όν•©λ‹ˆλ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„ 배포 μ‹œ Elastic Beanstalk을 μ‚¬μš©ν•˜λŠ” 경우 Java SE ν”Œλž«νΌμ„ 톡해 EC2 μΈμŠ€ν„΄μŠ€μ— Nginxλ₯Ό ν™œμš©ν•˜μ—¬ μ—­λ°©ν–₯ ν”„λ‘μ‹œλ₯Ό ꡬ성할 수 있기 λ•Œλ¬Έμ— λ°˜λ“œμ‹œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„μ—μ„œ TLS ν•Έλ“œμ‰μ΄ν¬λ₯Ό μˆ˜ν–‰ν•΄μ•Όν•˜λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€.

νšŒμ‚¬μ—μ„œ μš΄μ˜μ€‘μΈ μ›Ή μ„œλΉ„μŠ€λŠ” Nginxλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  NLBμ—μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„λ‘œ νŠΈλž˜ν”½μ΄ μ „λ‹¬λ˜λ„λ‘ κ΅¬μ„±ν–ˆμ—ˆμ§€λ§Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„ 규λͺ¨κ°€ 컀짐으둜 μΈν•˜μ—¬ λ‚΄λΆ€μ μœΌλ‘œ λ™μž‘ν•˜λŠ” μž‘μ—…μ΄ λ§Žμ•„μ§μ— 따라 TLS ν•Έλ“œμ‰μ΄ν¬ λΆ€ν•˜λ₯Ό μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„μ—μ„œ λΆ„λ¦¬ν•˜κΈ° μœ„ν•˜μ—¬ Nginxμ—μ„œ TLS μ˜€ν”„λ‘œλ“œλ₯Ό μˆ˜ν–‰ν•˜λ„λ‘ μ „ν™˜ν•  μ˜ˆμ •μž…λ‹ˆλ‹€.

AWS ALB

ECC μΈμ¦μ„œλ₯Ό μ§€μ›ν•˜μ§€ μ•ŠλŠ” NLB와 λ‹€λ₯΄κ²Œ ALB(Application Load Balancer)λŠ” 4096 λΉ„νŠΈ ν‚€ 길이의 RSA μΈμ¦μ„œμ™€ ECDSA둜 μ„œλͺ…λœ EC μΈμ¦μ„œλ₯Ό μ§€μ›ν•©λ‹ˆλ‹€. νšŒμ‚¬μ—μ„œ μš΄μ˜μ€‘μΈ μ›Ή μ„œλΉ„μŠ€λ₯Ό NLBμ—μ„œ ALB둜 μ „ν™˜ν•˜μ§€ μ•ŠλŠ” μ΄μœ λŠ” μ™„μ „ν•œ λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ μ•„ν‚€ν…μ²˜κ°€ μ•„λ‹ˆλ―€λ‘œ 경둜 기반으둜 λ³„λ„μ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„λ‘œ μ „λ‹¬ν•΄μ•Όν•˜λŠ” μš”κ΅¬μ‚¬ν•­μ΄ μ—†κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ 이유둜 인해 λΉ λ₯΄κ²Œ λ‘œλ“œλ°ΈλŸ°μ„œμ—μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„λ‘œ νŠΈλž˜ν”½μ΄ μ „λ‹¬λ˜λ„λ‘ NLBλ₯Ό μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

IT λΆ„μ•ΌλŠ” μ‹œκ°„μ΄ μ§€λ‚˜λ©΄μ„œ 기술이 점차 λ°œμ „ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. μ•„λ§ˆμ‘΄ μ›Ή μ„œλΉ„μŠ€κ°€ μ œκ³΅ν•˜λŠ” μ„œλΉ„μŠ€ κΈ°λŠ₯도 λ°œμ „ν•˜κ³  μžˆμŒμ„ 확인할 수 μžˆλŠ”λ° 2019년에 μž‘μ„±λœ κ³ μ • μ„Έμ…˜ κ΄€λ ¨ κΈ€μ—μ„œλŠ” NLBκ°€ κ³ μ • μ„Έμ…˜ κΈ°λŠ₯을 μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  λ‚˜μ™€μžˆμ§€λ§Œ ν˜„μž¬ ELB의 μ œν’ˆ λΉ„κ΅ν‘œμ™€ 비ꡐ해보면 λ°±μ—”λ“œ μ•”ν˜Έν™”, κ³ μ • μ„Έμ…˜ 뿐만 μ•„λ‹ˆλΌ λ‹€μ–‘ν•œ κΈ°λŠ₯을 μ§€μ›ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

ELB TLSv1.3 미지원

μ•„λ§ˆμ‘΄ μ›Ή μ„œλΉ„μŠ€μ˜ ELBμ—μ„œ TLS μ˜€ν”„λ‘œλ“œ κΈ°λŠ₯을 μ§€μ›ν•˜μ§€λ§Œ λ³΄μ•ˆ 정책에 따라 TLS ν•Έλ“œμ‰μ΄ν¬λ₯Ό μˆ˜ν–‰ν•˜κΈ° λ•Œλ¬Έμ— ν΄λΌμ΄μ–ΈνŠΈλŠ” TLS 1.3을 μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€. TLS 1.3을 μ§€μ›ν•˜κΈ° μœ„ν•œ μž‘μ—…μ€ 아직 μ§„ν–‰μ€‘μ΄λ―€λ‘œ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ TLS 1.3을 μ§€μ›ν•˜κ³ μžν•˜λŠ” κ²½μš°μ—λŠ” ELBμ—μ„œ TLS μ˜€ν”„λ‘œλ“œλ₯Ό μˆ˜ν–‰ν•˜λ„λ‘ ꡬ성할 수 μ—†κ³  NLB의 TCP λ¦¬μŠ€λ„ˆλ₯Ό μ„€μ •ν•˜μ—¬ νŠΈλž˜ν”½μ΄ EC2 μΈμŠ€ν„΄μŠ€λ‘œ μ „λ‹¬λ˜λ„λ‘ν•˜κ³  EC2 μΈμŠ€ν„΄μŠ€μ— μ‹€ν–‰λ˜μ–΄μžˆλŠ” Nginxλ₯Ό 톡해 TLS 1.3을 μ‚¬μš©ν•  수 있게 ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€.

Elastic Beanstalk TLS μ˜€ν”„λ‘œλ“œ

ELBμ—μ„œλŠ” TLS 1.3을 μ§€μ›ν•˜μ§€ μ•ŠμœΌλ©° NLBμ—μ„œλŠ” ECC μΈμ¦μ„œλ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€λŠ” 것을 μ•Œμ•˜μœΌλ―€λ‘œ Elastic Beanstalk으둜 μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 배포 μ‹œ Nginxμ—μ„œ SSL μΈμ¦μ„œλ₯Ό κ΄€λ¦¬ν•˜κ³  ν΄λΌμ΄μ–ΈνŠΈκ°€ TLS 1.3 λ²„μ „μœΌλ‘œ TLS ν•Έλ“œμ‰μ΄ν¬λ₯Ό μˆ˜ν–‰ν•  수 μžˆλ„λ‘ ν•  수 μžˆλŠ”κ°€λ₯Ό 검증해보고 마무리 ν•˜κ² μŠ΅λ‹ˆλ‹€.

Elastic Beanstalk Java SE ν”Œλž«νΌ

μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ°°ν¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” Java SE ν”Œλž«νΌ ν™˜κ²½μ„ κ΅¬μ„±ν•΄μ•Όν•©λ‹ˆλ‹€. μ΄λ•Œ, μƒ˜ν”Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μœΌλ‘œ Beanstalk ν™˜κ²½μ„ μ‹œμž‘ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

μ›Ή μ„œλ²„ ν™˜κ²½ 선택

μƒ˜ν”Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μœΌλ‘œ μ‹œμž‘

Beanstalk ν™˜κ²½ ꡬ성 μ‹œ λ‘œλ“œλ°ΈλŸ°μ„œλ₯Ό μ„€μ •ν•˜κ³  싢은 경우 μΆ”κ°€ μ˜΅μ…˜ ꡬ성을 톡해 μ‚¬μš©μž μ •μ˜ 섀정을 진행해야 ν•©λ‹ˆλ‹€.

JVM μ˜΅μ…˜ ν™˜κ²½λ³€μˆ˜

λ°°ν¬ν•˜κ³  λ³΄λ‹ˆ μ˜€νƒ€κ°€ μžˆμ—ˆλ„€μš” :)

λ‘œλ“œλ°ΈλŸ°μ‹± μΈμŠ€ν„΄μŠ€

NLB 선택 및 λ¦¬μŠ€λ„ˆ ꡬ성

그리고 EC2 μΈμŠ€ν„΄μŠ€ 접근을 μœ„ν•œ ν‚€λ₯Ό μ„€μ •ν•˜λŠ” λ“± λΆ€κ°€ 섀정을 ν•˜κ³  ν™˜κ²½μ„ μƒμ„±ν•˜λ©΄ λ‹€μŒκ³Ό 같이 μƒ˜ν”Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ°°ν¬λ˜λŠ” ν™˜κ²½μ΄ μ€€λΉ„λ©λ‹ˆλ‹€.

Java SE ν”Œλž«νΌ ν™˜κ²½ 생성 μ™„λ£Œ

처음 ν™˜κ²½μ„ ꡬ성할 λ•Œ 였λ₯˜κ°€ λ°œμƒν•˜λŠ” 경우 Beanstalkμ—μ„œλŠ” ν™˜κ²½ μ‚­μ œ λ²„νŠΌμ΄ ν™œμ„±ν™”λ˜μ§€ μ•Šμ•„ λ‹Ήν™©ν•  수 μžˆμœΌλ‚˜ CloudFormation μ„œλΉ„μŠ€λ‘œ μ΄λ™ν•˜μ—¬ Beanstalk ν™˜κ²½μ„ ꡬ성쀑인 μŠ€νƒμ„ μ‚­μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ νŒ¨ν‚€μ§• 및 Java SE ν”Œλž«νΌ ν™•μž₯

μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ°°ν¬ν•˜κΈ° μœ„ν•œ Java SE ν”Œλž«νΌμ΄ μƒμ„±λ˜μ—ˆμœΌλ‹ˆ μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ νŒ¨ν‚€μ§•ν•˜μ—¬ Beanstalk에 λ°°ν¬ν•˜κΈ° μœ„ν•œ μ†ŒμŠ€ λ²ˆλ“€ νŒŒμΌμ„ λ§Œλ“€μ–΄μ•Ό ν•©λ‹ˆλ‹€. μ†ŒμŠ€ λ²ˆλ“€μ—λŠ” νŒ¨ν‚€μ§•λœ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ Jar 파일과 ν•¨κ»˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰λ₯Ό μœ„ν•œ Procfile을 ν¬ν•¨μ‹œμΌœμ•Ό ν•©λ‹ˆλ‹€.

build.gradle
task procfile(dependsOn: bootJar) { doFirst { new File("build/libs", "Procfile").text = "web: java -Xmx1g -Dfile.encoding=UTF-8 -jar ${bootJar.archiveName}" } } task awsbuild(type: Zip, dependsOn: procfile) { from ('.beanstalk/.ebextensions') { into '.ebextensions' } from ('.beanstalk/.platform') { into '.platform' } from ('build/libs') { include('Procfile') include(bootJar.archiveName) } baseName = 'beanstalk' }

μžμ„Έν•œ λ‚΄μš©μ€ Procfile을 μ‚¬μš©ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ‘œμ„ΈμŠ€ ꡬ성을 μ°Έκ³ ν•˜μ„Έμš”.

Java SE ν”Œλž«νΌ ν™•μž₯ ꡬ성

BeanstalkλŠ” .ebextensions와 .platform을 ν™œμš©ν•˜μ—¬ EC2 μΈμŠ€ν„΄μŠ€ ν™˜κ²½μ„ ν™•μž₯ν•  수 μžˆλŠ” κΈ°λŠ₯을 μ§€μ›ν•©λ‹ˆλ‹€. μš°λ¦¬λŠ” HTTP둜 μ‹€ν–‰λ˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„μ™€ ν•¨κ»˜ TLS μ˜€ν”„λ‘œλ“œλ₯Ό μˆ˜ν–‰ν•  Nginxλ₯Ό κ΅¬μ„±ν•΄μ•Όν•˜λ―€λ‘œ λ‹€μŒκ³Ό 같이 ꡬ성 및 ν”Œλž«νΌ ν™•μž₯ νŒŒμΌμ„ μƒμ„±ν•©λ‹ˆλ‹€.

Nginxμ—μ„œ μ‚¬μš©ν•  SSL μΈμ¦μ„œ 파일 생성

beanstalk/.ebextensions/nginx-certificates.config
files: /etc/nginx/cert/server.crt: mode: "000400" owner: nginx group: nginx content: | -----BEGIN CERTIFICATE----- #### PROTECTED #### -----END CERTIFICATE----- /etc/nginx/cert/server.key: mode: "000400" owner: nginx group: nginx content: | -----BEGIN EC PARAMETERS----- #### PROTECTED #### -----END EC PARAMETERS----- -----BEGIN EC PRIVATE KEY----- #### PROTECTED #### -----END EC PRIVATE KEY----- /etc/nginx/cert/server-ca-bundle: mode: "000400" owner: nginx group: nginx content: | -----BEGIN CERTIFICATE----- #### PROTECTED #### -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- #### PROTECTED #### -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- #### PROTECTED #### -----END CERTIFICATE----- commands: 00-chain-ca-bundle: cwd: /etc/nginx/cert command: | cat server.crt server-ca-bundle > server-ca.pem chown nginx:nginx server-ca.pem chmod 400 server-ca.pem 99-remove-bak: cwd: /etc/nginx/cert command: rm -f *.bak

νšŒμ‚¬ 도메인에 λŒ€ν•œ μΈμ¦μ„œμ΄λ―€λ‘œ μΈμ¦μ„œ λ‚΄μš©μ€ λ§ˆμŠ€ν‚Ή μ²˜λ¦¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

Nginx μ„€μ • 파일 ν™•μž₯

beanstalk/.platform/nginx/conf.d/elasticbeanstalk/00_application.conf
location / { return 301 https://$host$request_uri; }

기본으둜 λ§Œλ“€μ–΄μ§€λŠ” 00_application.conf νŒŒμΌμ€ 80 ν¬νŠΈμ— λŒ€ν•˜μ—¬ 5000 포트둜 μ „λ‹¬λ˜λ„λ‘ κ΅¬μ„±ν•˜λ―€λ‘œ 443 포트둜 λ¦¬λ‹€μ΄λ ‰νŠΈν•˜λ„λ‘ ν™•μž₯ν•©λ‹ˆλ‹€.

beanstalk/.platform/nginx/nginx.conf
user nginx; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; worker_processes auto; worker_rlimit_nofile 32768; events { use epoll; worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; include conf.d/*.conf; map $http_upgrade $connection_upgrade { default "upgrade"; } server { listen 80 default_server; access_log /var/log/nginx/access.log main; client_header_timeout 60; client_body_timeout 60; keepalive_timeout 60; gzip off; gzip_comp_level 4; gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript; # Include the Elastic Beanstalk generated locations include conf.d/elasticbeanstalk/*.conf; } server { listen 443 ssl default_server; server_name springboot; ssl_certificate /etc/nginx/cert/server-ca.pem; ssl_certificate_key /etc/nginx/cert/server.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_verify_client optional_no_ca; location / { proxy_pass http://127.0.0.1:5000; proxy_http_version 1.1; proxy_set_header Connection $connection_upgrade; proxy_set_header Upgrade $http_upgrade; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-SSL-CERT $ssl_client_escaped_cert; proxy_buffering off; } } }

μžμ„Έν•œ λ‚΄μš©μ€ Elastic Beanstalk Linux ν”Œλž«νΌ ν™•μž₯을 μ°Έκ³ ν•˜μ„Έμš”. elastic-beanstalk-samples처럼 μƒ˜ν”Œ νŒŒμΌλ„ κ³΅μœ λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€.

이제 μƒ˜ν”Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λŒ€μ‹  μš°λ¦¬κ°€ μ€€λΉ„ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ†ŒμŠ€ λ²ˆλ“€μ„ μ—…λ‘œλ“œν•˜λ©΄ Benstalk 엔진이 μ†ŒμŠ€ λ²ˆλ“€μ„ μΆ”μΆœν•˜κ³  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜κ²Œ λ©λ‹ˆλ‹€. Route 53으둜 Beanstalk ν™˜κ²½ μ£Όμ†Œλ₯Ό DNS둜 μ—°κ²°ν•˜κ³  접속해보면 λ‹€μŒκ³Ό 같이 TLS ν•Έλ“œμ‰μ΄ν¬κ°€ μˆ˜ν–‰λ˜μ—ˆμŒμ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

NLBλŠ” νŠΈλž˜ν”½μ„ EC2 μΈμŠ€ν„΄μŠ€μ˜ 443 포트둜 μ „λ‹¬ν–ˆμ„ 뿐 TLS μ˜€ν”„λ‘œλ“œλŠ” Nginxμ—μ„œ μˆ˜ν–‰ν•˜λŠ” κ²ƒμœΌλ‘œ κ΅¬μ„±ν–ˆκΈ° λ•Œλ¬Έμ— λΈŒλΌμš°μ €μ—μ„œλŠ” TLS 1.3 λ²„μ „μœΌλ‘œ TLS ν•Έλ“œμ‰μ΄ν¬λ₯Ό μˆ˜ν–‰ν–ˆμŠ΅λ‹ˆλ‹€. μ΄λ ‡κ²Œ μ•„λ§ˆμ‘΄ μ›Ή μ„œλΉ„μŠ€μ—μ„œ TLS 1.3을 μ§€μ›ν•˜κΈ° μœ„ν•΄μ„œλŠ” NLB의 TCP λ¦¬μŠ€λ„ˆμ™€ Nginx의 TLS μ˜€ν”„λ‘œλ“œλ₯Ό ν™œμš©ν•˜λ©΄ κ°€λŠ₯함을 κ²€μ¦ν–ˆμŠ΅λ‹ˆλ‹€.

νŠΈλŸ¬λΈ”μŠˆνŒ…

Elastic Beanstalk둜 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ°°ν¬ν•˜λŠ” κ³Όμ •μ—μ„œ 생각보닀 였λ₯˜κ°€ λ§Žμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. 이 λ‚΄μš©μ€ Benstalkμ—μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 배포 μ‹œ λ°œμƒν•˜λŠ” μ—¬λŸ¬κ°€μ§€ 문제λ₯Ό ν•΄κ²°ν•˜λŠ”λ° 도움이 λ˜λŠ” ν•­λͺ©μ„ μ •λ¦¬ν•œ κ²ƒμž…λ‹ˆλ‹€. λ”°λΌν•΄λ³΄λŠ” λΆ„λ“€μ—κ²Œ 도움이 λ˜μ…¨μœΌλ©΄ ν•˜λŠ” λ°”λž¨μœΌλ‘œ κ³΅μœ ν•©λ‹ˆλ‹€.

κ²½λ‘œμš©λ„
/etc/nginx/Nginx ꡬ성
/var/app/currentμ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ†ŒμŠ€ λ²ˆλ“€ μΆ”μΆœ 경둜
/var/log/eb-engine.logBeanstalk 둜그
/var/log/nginxNginx 둜그
/var/log/web.stdout.outμ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 둜그

Beanstalk λ‘œκ·ΈλŠ” Beanstalk 엔진이 ν”Œλž«νΌ ν™•μž₯ νŒŒμΌλ“€μ„ μ‹€ν–‰ν•˜κ³  μ„±κ³΅ν–ˆλŠ”μ§€ μ—¬λΆ€λ₯Ό κΈ°λ‘ν•©λ‹ˆλ‹€. 이 둜그λ₯Ό 톡해 μ–΄λŠ λ‹¨κ³„μ—μ„œ 였λ₯˜κ°€ λ°œμƒν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 배포 및 μ „ν™˜μ΄ μ‹€νŒ¨ν•˜μ˜€λŠ”μ§€ 확인할 수 μžˆλŠ” μ€‘μš”ν•œ λ‘œκ·Έμž…λ‹ˆλ‹€. 그리고 λ‚˜λ¨Έμ§€ ν•­λͺ©μ„ 톡해 μ„€μ •ν•œ ꡬ성 및 ν™•μž₯ 파일이 μ œλŒ€λ‘œ μΆ”μΆœλ˜μ–΄ λ³΅μ‚¬λ˜μ—ˆλŠ”μ§€ Nginxκ°€ ELB에 μ˜ν•΄ μ „λ‹¬λœ νŠΈλž˜ν”½μ„ μ• ν”Œλ¦¬μΌ€μ΄μ…˜κΉŒμ§€ 전달할 수 μžˆλŠ”μ§€λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

Nginx에 λŒ€ν•΄μ„œ μžμ„Ένžˆ μ•„λŠ” 것은 μ•„λ‹ˆλ―€λ‘œ μ„€μ • 파일이 잘λͺ»λœ 뢀뢄이 μžˆμ„ 수 μžˆμœΌλ‹ˆ μ–‘ν•΄ 바라며 잘λͺ»λœ 점은 νŒ¨λ“œλ°± μ£Όμ‹œλ©΄ κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€.

κ°μ‚¬ν•©λ‹ˆλ‹€.