<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Teches on man.hwangsehyun.com</title>
    <link>https://man.hwangsehyun.com/kp/tech/</link>
    <description>Recent content in Teches on man.hwangsehyun.com</description>
    <image>
      <title>man.hwangsehyun.com</title>
      <url>https://man.hwangsehyun.com/images/papermod-cover.png</url>
      <link>https://man.hwangsehyun.com/images/papermod-cover.png</link>
    </image>
    <generator>Hugo -- 0.145.0</generator>
    <language>kp</language>
    <atom:link href="https://man.hwangsehyun.com/kp/tech/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Experiences with Networking</title>
      <link>https://man.hwangsehyun.com/kp/tech/networking/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://man.hwangsehyun.com/kp/tech/networking/</guid>
      <description>&lt;h2 id=&#34;aws-vpc&#34;&gt;AWS VPC&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;HTTP API Gateway와 Elastic Load Balancer를 통해서 [Cloud Map Service]에 등록된 VPC 내부 리소스를 안전하게 공개합니다.&lt;/li&gt;
&lt;li&gt;Public IP가 없는 VPC 내부의 리소스에 대해서 &lt;a
  href=&#34;https://docs.aws.amazon.com/whitepapers/latest/aws-privatelink/what-are-vpc-endpoints.html#gateway-endpoints&#34;
  &gt;Gateway endpoints&lt;/a
&gt;
를 통해서 AWS 내부의 서비스에 접근하게 할 수 있습니다.&lt;/li&gt;
&lt;li&gt;적절한 기준을 가지고 ACL, Security group을 관리할 수 있습니다.&lt;/li&gt;
&lt;li&gt;VPC peering을 통해서 계정/리전이 다른 다수의 VPC를 운영할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;edge-networking&#34;&gt;Edge Networking&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
  href=&#34;https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-anywhere.html&#34;
  &gt;ECS Anywhere&lt;/a
&gt;
 서비스로 On-premise 인프라를 ECS cluster에 등록해 서비스할 수 있습니다.&lt;/li&gt;
&lt;li&gt;Frontend 개발자와 협력해 &lt;a
  href=&#34;https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html&#34;
  &gt;CloudFront routing rule&lt;/a
&gt;
을 작성하고 배포와 테스트를 지원합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;!--stackedit_data:
eyJoaXN0b3J5IjpbLTY5NTkwMzcyNSwxNjYwMDI3NjM1LDE2ND
cwMTA1NzksLTUxMTkyMTQ1Myw2Mjc4NDY3MzEsMTkwOTgwNjYw
NCwtMTY5NzYwNjg1NSwzODcxMjQ2NzZdfQ==
--&gt;</description>
    </item>
    <item>
      <title>Monitoring Experiences</title>
      <link>https://man.hwangsehyun.com/kp/tech/monitoring/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://man.hwangsehyun.com/kp/tech/monitoring/</guid>
      <description>&lt;h2 id=&#34;cloudwatch&#34;&gt;CloudWatch&lt;/h2&gt;
&lt;h3 id=&#34;log--metrics-collection&#34;&gt;Log &amp;amp; Metrics Collection&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
  href=&#34;https://hub.docker.com/r/amazon/cloudwatch-agent&#34;
  &gt;CloudWatch agent container&lt;/a
&gt;
로 Systemd log와 Custom log를 CloudWatch로 수집합니다.&lt;/li&gt;
&lt;li&gt;Request id, Execution id 등 AWS에서 부여한 UUID들을 기준으로 DB를 설계하고 로그에 포함시켜 Tracing을 용이하게 합니다.&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/SubscriptionFilters.html&#34;
  &gt;Subscription filter&lt;/a
&gt;
 기능으로 서비스에서 발생한 중요 로그를 전파합니다.&lt;/li&gt;
&lt;li&gt;EC2, RDS 등의 AWS 서비스에서 기본으로 제공하는 &lt;a
  href=&#34;https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/working_with_metrics.html&#34;
  &gt;CloudWatch metrics&lt;/a
&gt;
 외에도 Custom metrics를 정의해 관심 대상으로 설정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;monitoring&#34;&gt;Monitoring&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
  href=&#34;https://docs.aws.amazon.com/sns/latest/dg/sns-email-notifications.html&#34;
  &gt;SNS topic에 email subscription&lt;/a
&gt;
을 추가해 서비스에서 직접 Topic에 메시지를 발송합니다.&lt;/li&gt;
&lt;li&gt;Metric에 Anomaly condition을 정의하고 &lt;a
  href=&#34;https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html&#34;
  &gt;CloudWatch alarm&lt;/a
&gt;
을 설정합니다.&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://w1694659396-omq861390.slack.com/apps/A6L22LZNH-aws-chatbot&#34;
  &gt;AWS Chatbot Slack App&lt;/a
&gt;
을 도입해 사내 메신저로 알림을 수신했습니다.
&lt;ul&gt;
&lt;li&gt;CloudWatch alarm state 변경 시&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-instance-state-changes.html&#34;
  &gt;EC2 Instance state change event&lt;/a
&gt;

&lt;blockquote&gt;
&lt;p&gt;EC2 state change event
-&amp;gt; EventBridge
-&amp;gt; SNS
-&amp;gt; AWS ChatBot&lt;/p&gt;</description>
    </item>
    <item>
      <title>Operations: Dev, Building, Testing, CI/CD, and more...</title>
      <link>https://man.hwangsehyun.com/kp/tech/operations/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://man.hwangsehyun.com/kp/tech/operations/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;개발 팀이 편안한 환경에서 장기적인 성과를 낼 수 있도록 노력해왔습니다.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;development&#34;&gt;Development&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;가장 코드 양이 많은 JavaScript, Python을 중심으로 Convention 확립에 노력했습니다.&lt;/li&gt;
&lt;li&gt;JavaScript, TypeScript Node.js 프로젝트에 전역적으로 적용할 수 있는 &lt;a
  href=&#34;https://eslint.org/docs/latest/extend/shareable-configs&#34;
  &gt;ESLint Sharable Config&lt;/a
&gt;
를 &lt;a
  href=&#34;https://github.com/sehyun-hwang/eslint-config-nextlab&#34;
  &gt;https://github.com/sehyun-hwang/eslint-config-nextlab&lt;/a
&gt;
에서 오픈소스로 관리하고 있습니다.&lt;/li&gt;
&lt;li&gt;Python에서는 Type checking과 Linting을 동시에 구동하기 위해서 mypy를 Child process로 실행하는 pylint plugin을 제작한 적이 있으며, 최근에는 ruff linter와 black formatter를 사용하고 있습니다.&lt;/li&gt;
&lt;li&gt;다양한 언어로 이루어진 Monorepo에 대한 Convention을 관리하기 위해서 &lt;a
  href=&#34;https://megalinter.io/latest/&#34;
  &gt;MegaLinter&lt;/a
&gt;
와 그것의 &lt;a
  href=&#34;https://github.com/marketplace/actions/megalinter&#34;
  &gt;Github Action&lt;/a
&gt;
을 도입했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;building&#34;&gt;Building&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;이미지 처리 등의 특수한 기능이 있는 컨테이너들에 대해서는 불필요한 컴파일러와 인터프리터를 제거하는 &lt;a
  href=&#34;https://docs.docker.com/build/building/multi-stage/&#34;
  &gt;Multi-stage build&lt;/a
&gt;
를 수행했습니다.&lt;/li&gt;
&lt;li&gt;alpine 기반의 컨테이너로 컨테이너의 이미지 크기를 줄여 빌드 시간 단축, 배포 속도 개선, 취약점 개선 등의 효과를 얻었습니다.&lt;/li&gt;
&lt;li&gt;복수의 Dockerfile을 이용한 Container build, 빌드 캐시 관리 등 High-level build 기능을 구현해주는 &lt;a
  href=&#34;https://docs.docker.com/build/bake/&#34;
  &gt;&lt;code&gt;buildx bake&lt;/code&gt;&lt;/a
&gt;
를 도입했습니다.&lt;/li&gt;
&lt;li&gt;Makefile을 이용해 직접 별도로 컴파일해야 하는 C++ 프로젝트나 표준적이지 않은 프로젝트의 개발-빌드-테스트-배포 과정을 관리합니다.&lt;/li&gt;
&lt;li&gt;빌드를 위한 인프라를 관리할 필요가 없고 동시에 작업을 병렬적으로 진행할 수 있는 Serverless CI를 추구합니다.
&lt;ul&gt;
&lt;li&gt;AWS CodeBuild&lt;/li&gt;
&lt;li&gt;GitHub Action&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;testing&#34;&gt;Testing&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Test runner가 테스트 케이스들을 병렬적으로 수행하는 데 문제가 없도록 하는 정석적인 객체 지향 코드를 작성합니다. 서비스 코드에 Side effect가 없고 부분 별로 역할 구분이 명확해야 테스트 코드에서 class를 상속받아서 테스트 케이스를 작성할 수 있었습니다.&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://vitest.dev/&#34;
  &gt;vitest&lt;/a
&gt;
, &lt;a
  href=&#34;https://docs.pytest.org/en/stable/&#34;
  &gt;pytest&lt;/a
&gt;
로 테스트 케이스를 작성할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;!--stackedit_data:
eyJoaXN0b3J5IjpbLTE5ODkxMTU4NDUsNzQ3Njg3NTc3LC0xMz
AzMDYxODAxLC0xOTMyNjY2MDg0LC0xNTc3MDgyMjE5LC03MDIz
MTU0MDksMTY0OTUxNTQ0NiwtMjA3NDg5NTI0NCwxNTcwMDcxND
A5LDg3NDc4Mzk2NywtMTk5ODE4MzY1MCwtMTY5NjU2Mzc1OCwx
MTExNTQ2ODI1LDEyMzUxODU2NDgsLTE2MDA0NjU1MjMsMTIzNT
E4NTY0OCwxODUzOTE3MjQ5LDk2MTIxNDYyMywtOTI1OTUwMDcx
LDczMDk5ODExNl19
--&gt;</description>
    </item>
    <item>
      <title>Security Routines</title>
      <link>https://man.hwangsehyun.com/kp/tech/security/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://man.hwangsehyun.com/kp/tech/security/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;어떻게 보면 당연한 관습들을 풀어서 글로 남겼습니다.&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;routines&#34;&gt;Routines&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a
  href=&#34;https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html&#34;
  &gt;&lt;strong&gt;IAM&lt;/strong&gt;&lt;/a
&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Production 환경에서는 &lt;a
  href=&#34;https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html&#34;
  &gt;Lambda execution role&lt;/a
&gt;
과 &lt;a
  href=&#34;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html&#34;
  &gt;EC2 IAM role&lt;/a
&gt;
 등의 &lt;a
  href=&#34;https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html&#34;
  &gt;IAM temporary credential&lt;/a
&gt;
 기능을 활용합니다.&lt;/li&gt;
&lt;li&gt;리소스에게 부여된 권한들은 해당 리소스의 동작에 대한 명세이기도 하다고 생각하고 있으며, Service role에 Least privilege rule을 최대한 준수했습니다.&lt;/li&gt;
&lt;li&gt;프로젝트 별로 User group을 만들고 개발자들에게 개발에 필요한 권한을 부여합니다.&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://cli.github.com/manual/gh_auth_login&#34;
  &gt;GitHub CLI SSO&lt;/a
&gt;
, &lt;a
  href=&#34;https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sso.html&#34;
  &gt;AWS CLI SSO&lt;/a
&gt;
 등의 SSO 서비스를 사용해 개발자가 개발에 필요한 권한을 획득할 수 있도록 도입 중입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Secrets Management&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Skills &amp; Experiences with AWS</title>
      <link>https://man.hwangsehyun.com/kp/tech/aws/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://man.hwangsehyun.com/kp/tech/aws/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;AWS에서 어떤 서비스를 써보셨나요?&lt;/em&gt;
라는 질문에 답하기 힘들어서 적은 페이지&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;skills&#34;&gt;Skills&lt;/h2&gt;
&lt;h3 id=&#34;infra&#34;&gt;Infra&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Python, Node.js 등의 언어로 작성된 코드가 구동되는 EC2 instance의 type과 FarGate, Lambda 등 Serverless 서비스의 spec을 선정할 수 있습니다.&lt;/li&gt;
&lt;li&gt;비용 절감
&lt;ul&gt;
&lt;li&gt;Lambda와 Container에 &lt;strong&gt;ARM architecture&lt;/strong&gt;를 우선적으로 검토합니다.&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/using-spot-instances.html&#34;
  &gt;EC2 Spot instance&lt;/a
&gt;
와 &lt;a
  href=&#34;https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/bestpracticesguide/ec2-and-fargate-spot.html&#34;
  &gt;Fargate Spot capacity provider&lt;/a
&gt;
 등 짧은 생명 주기를 가진 인프라를 이용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Storage.html&#34;
  &gt;EBS, EFS, S3&lt;/a
&gt;
 등 적절한 종류의 Storage를 선택하고 EC2 등의 인프라에서 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;a
  href=&#34;https://docs.aws.amazon.com/aws-backup/latest/devguide/creating-a-backup-plan.html&#34;
  &gt;AWS Backup plan &amp;amp; lifecycle&lt;/a
&gt;
을 지정해 &lt;a
  href=&#34;https://docs.aws.amazon.com/ebs/latest/userguide/ebs-snapshots.html&#34;
  &gt;EBS&lt;/a
&gt;
, &lt;a
  href=&#34;https://docs.aws.amazon.com/efs/latest/ug/awsbackup.html&#34;
  &gt;EFS&lt;/a
&gt;
, &lt;a
  href=&#34;https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateSnapshot.html&#34;
  &gt;RDS&lt;/a
&gt;
 등에 대해서 주기적으로 Backup을 수행하고 삭제할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;monitoring&#34;&gt;Monitoring&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a
  href=&#34;https://man.hwangsehyun.com/tech/monitoring/#cloudwatch&#34;
  &gt;Monitoring experience 페이지의 CloudWatch 부분&lt;/a
&gt;
을 참조해주세요.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
