Category: AWS

A contents of Amazon Web Services

AWS Athena 로 VPC Flow Log 분석하기 – 1

AWS Athena 는 로그 분석 서비스로 Hive 와 같다. 가장 많이 쓰이는 부분이 VPC Flow Log 를 분석하는데에 Athena 를 이용하는 방법이다. 이 글에서는 어떻게 VPC Flow Log 를 Athena 를 통해서 분석하는 알아 본다.

VPC Flow Log 설정

VPC Flow Log 설정은 간단하다. VPC 에서 Flow logs 탭에서 설정하면 그만인데, 다음과 같은 파라메터를 필요로 한다.

  • Destination Type: S3
  • Destination Name: S3 로 지정했을 시에 S3 Bucket 이름.
  • Log record format: AWS default format
  • Log file format: Text (default)
  • Partition logs by time: Every 24 hours (default)

여기서 중요한 것은 밑에서 3가지 정도다. Log record format 을 바꿀 경우에 Athena 테이블 생성시에 맞춰야 한다. Partition logs by time 을 24 시간으로 하면 S3 버킷 안에서 2022/08/29 형식으로 폴더가 생성되면서 VPC 로그가 전송 된다. 하루에 한번 폴더를 생성하면서 로그가 쌓인다는 뜻이다. 만일 Every 1 hours (60 minutes) 으로 할 경우에 2022/08/29/09 폴더가 생성되면서 로그가 쌓인다. 이 폴더의 구조는 나중에 Athena 에서 파티션 프포젝션(Partition Projection) 을 설정할때에 참고하게 된다.

또, S3 버킷으로 전송할 경우에 S3 의 암호화를 SSE_S3 로 할 것을 권장한다. CMK 로 할 경우에 로그가 쌓이지 않을 가능성이 있다. 또, 향후에 권한지정에서 CMK 권한을 함께 줘야하는 복잡함이 있을 수 있다.

S3 버킷 확인

필자의 VPC Log 설정으로 인해서 S3 에는 다음과 같은 형태로 S3 에 로그가 쌓이고 있다.

버킷 이름만 지정해주면 그 안에 AWSLogs/계정ID/vpclfowlogs/ap-northeast-2/ 가 자동으로 생성되며 그 안으로 year/month/day 순으로 생성된다.

앞에서 VPC Flow Logs 설정할때에 Partition logs by time 에서 Every 24 hours (default) 로 지정했기 때문에 날짜별로 생성된다.

Athena 작업

작업그룹(Workgroups) 생성

먼저 Athena 에서 필요한 것이 작업그룹(Workgroups) 이다. 기본적으로 Primary 가 기본 생성되어 있지만 하나 생성한다. 생성할때에 필요한 것은 다음과 같다.

쿼리 결과를 받을 S3 를 지정해야 한다. 만일 암호화가 필요하다면 SSE_S3 를 권장한다. CMK 도 가능하지만 Role 설정을 잘 해줘야 한다.

데이터 사용량을 적절하게 조절해 주길 권장한다. 덮어놓고 좋다고 No limit 로 하는 순간 돈이 술술 나갈 것이다. 이 데이터 사용량은 얼마든지 설정을 변경할 수 있다.

Database 생성

Query Editor 로 이동해 화면 오른쪽 상단에서 앞에서 생성한 작업그룹(Workgroup) 으로 변경해 준다.

그러면 Workgroup 이 변경 된다. 이제 다음과 같이 Database 를 생성해 준다.

위 쿼리문은 화면안에 쿼리입력창에 입력하고 ‘Run’ 을 클릭해주면 된다.

이렇게 하면 데이터베이스가 생성이 된다. 그리고 왼쪽에 Database 부분에서 새로 생성한 데이터베이스를 선택해 준다.

위와같은 상태가 된다면 이제 테이블을 생성해야 한다.

Table 생성

이제 Table 을 생성해야 한다. 테이블을 생성할때에 중요한 것이 VPC Flow Log 의 S3 저장소와 데이터 컬럼들이다. 다음과 같다.

테이블을 생성할때에 컬럼을 지정해 줘야 하는데, VPC Flow Log 설정할때에 record format 을 AWS Default Format 을 지정했는데, 그 포맷은 위와 같다. 이 컬럼들은 S3 에 저장된 파일을 열었을 때에 맨 처음 나오는 행에 컬럼헤더 값들이다. 정확히는 ‘_’ 가 ‘-‘ 로 보면 정확하다. Athena 테이블은 ‘-‘ 를 ‘_’ 로 변환된다.

중요한 것은 Partitioned BY 부분에 date 부분이다. 테이블을 파티셔닝을 하기 위한 기준이 되는 컬럼을 추가하는 것이다. 이 파티션 컬럼은 S3 에 저장되는 VPC Flow Log 에는 없는데 파티셔닝 테이블을 생성할때에 이름처럼 생성된다.

위 쿼리문을 실행해 테이블을 생성한다.

파티션 생성

만일 파티션이 없다면 쿼리 시간이 길어진다. VPC Flow Log 의 경우 날짜로별로(yyyy/MM/dd) 쌓이는 것에 창안해 파티션을 날짜별로 생성하도록 할 것이다. 다음과 같이 파티션을 생성해준다.

이렇게 하면 2022/08/29 에 해당하는 버킷에 내용이 파티션으로 입력 된다.

파티션을 이용하면 데이터 조회시에 그 범위가 줄어든다. 정확하게는 데이터 스캔(Data Scan) 범위를 줄일 수 있어서 쿼리 속도를 높여줄 뿐만 아니라 스캔 범위가 줄어들기 때문에 데이터를 긁어오는 양도 줄게되어서 비용을 아낄 수 있다.

앞에서 만든 테이블의 경우 date 컬럼은 date 테이터 타입임으로 다음과 같은 쿼리가 가능하다.

date 타입이기 때문에 문자열을 date 타입으로 해줘야 한다.

파티션 생성 문제

파티션을 생성하면 문제가 하나 있다. 날짜별로 하나하나 다 생성해 줘야 한다. 시간은 흐르고 날짜는 변경될 것이다. 내일이 되면 다른 날짜로 S3 에 폴더가 만들어지고 거기에 데이터가 쌓일 것이다. 그러면 Athena 에서 그 날짜에 맞는 S3 저장소의 파티션을 생성해줘야 한다.

매일매일 하루에 한번 이것을 해야 한다고 생각하면 힘들다.

이것을 자동으로 하는 방법은 존재한다. Lambda 를 이용하는 것이다.

Lambda 작성하기

Lambda 실행을 위한 Role 생성

Lambda 를 작성해 자동으로 매일매일 하루에 한번 파티션을 생성하도록 해보자. Lambda 를 실행하기 위해서는 먼저 Lambda 실행을 위한 Role 이 필요하다.

Lambda 실행을 위한 Role 을 위와같이 생성해 준다.

Lambda 생성

Lambda 는 여러가지 언어로 작성될 수 있는데, 여기서는 Python 을 이용했다.

Lambda 를 실행하는 Roles 는 앞에서 작성한 Roles 를 지정해 준다.

EventBridge Rule 생성

EventBridge 에서 Rule 를 생성해 매일 자정 0시 0분에 람다를 실행하도록 설정해 준다.

KST 를 위한 Athena 테이블 View 생성

Athena 에 vpc_flow_logs 테이블에 start, end 컬럼은 unixtime 이지만 UTC 기반이다. 이것을 KST 기반으로 보기 위해서는 연산이 필요한데, 그것을 아예 View 만들어 놓으면 좋다.

이제는 vpc_flow_logs_kst 뷰(view) 에 질의를 하면 start, end 컬럼의 데이터가 KST 시간으로 표신된다.

결론

지금까지 VPC Flow Log 생성에서부터 Athena 를 이용하는 방법, 더 나가 자동으로 파티션을 생성하도록 Lambda 까지 작성해봤다.

하지만, Lambda 작성도 필요없는 방법이 있다. 파티션 프로젝션(Partition Projection) 이라고 불리는 방법인데, 이것은 처음 테이블을 생성할때에 S3 의 날짜 폴더 구조를 기반으로 자동으로 파티션을 인식시키는 방법이다. 이렇게 하면 Lambda 를 이용해 파티션을 수동으로 생성해줄 필요가 없게된다.

AWS S3 PreSigned URL 설정하기

AWS S3 PreSigned URL 설정에 대해서 알아 본다. AWS S3 는 저장된 객체에 대해 HTTP 를 통해서 다운로드를 제공 한다. 문제는 이렇게 객체를 다운로드 하도록 주소를 공개할 경우에 누구나 다운로드 할 수있게 되서 보안상 좋지 않다. 그래서 AWS S3 는 인증 과정을 통해서 특정 시간 동안만 URL 에 다운로드 권한을 부여하는 PreSigned URL 기능을 제공하는데 이에 대해서 알아 본다.

AWS 사용자

먼저 PreSigned URL 에 인증 과정에서 사용할 Signiture 생성을 위해서 accesskey, secretkey 가 필요하다. 이것은 결국 AWS 사용자가 필요하다는 것과 같다.

사용자를 추가할때는 “AWS 액세스 유형 선택” 에서 “액세스 키- 프로그래밍 방식 액세스” 유형으로 계정을 생성해야 한다. AWS 콘솔로 로그인이 불필요한 사용자 이기 때문인데, 이렇게 생성을 진행하면 마지막에 accesskey, secretkey 가 발급되어 진다. 이것을 잘 보관 하자.

IAM Role, Policy

AWS S3 Presigned URL 을 위해 생성한 AWS 계정에는 그 어떤 IAM Role, Policy 가 필요하지 않다. 이것은 사용자에 S3 권한 설정을 IAM 을 통해서 할지 아니면 AWS S3 의 Permission Policy 로 할지에 따라 다를 수 있다. AWS S3 에서도 Permission Policy 를 설정할 수 있고 이 설정에서 특정 사용자에게 정책을 부여할 수 있다.

AWS S3 Presigned URL 만을 위한 계정이기 때문에 IAM 에서 권한을 부여하지 말고 AWS S3 에서 권한을 부여 방법을 선택 했다.

AWS S3 생성

AWS S3 는 글로벌 한 서비스이지만 생성할 리전을 선택할 수 있다. 생성할때에 S3 버킷에 대해서 별다른 설정을 하지 않고 그냥 기본값으로 생성한다. 나중에 설정을 얼마든지 변경할 수 있는데, 단 Presigned URL 을 한다고 해서 “Block Public Access settings for this bucket” 을 손대서는 안된다.

PreSigned URL 을 한다고 버킷의 공개 접근 설정을 변경해서는 절대로 안된다. 혹자는 URL 자체를 제공해줘야 하기 때문에 공개설정을 해줘야 한다고 하지만 특정 사용자에게 URL 을 제공하는 방식이기 때문에 버킷의 공개 접근 설정은 불 필요 하다.

AWS S3 Bucket Policy

여기서 핵심인데, 앞에서 AWS 계정에 아무런 권한 설정을 하지 않았다. 이제 그 권한 설정을 AWS S3 버킷에서 해주면 된다. Permission 탭에서 Bucket Policy 를 볼 수 있는데, 여기서 다음과 같이 해주자.

Principal 에 앞에서 생성한 AWS 계정이다. Resource 에는 Bucket 의 arn 을 주면 된다.

테스트

이제 테스트를 해보자. 테스트는 간단하게 Python 코드를 작성해 해보면 된다.

access key id 와 secret key id, Bucket Name 에 본인에 맞게 수정해 준다. 거기다 ‘utils/putty.exe’ 는 AWS S3 버킷에 있는 객체다.

위 코드를 실행하면 Presigned URL 이 출력이 된다. 유효기간은 expiration 변수에 값을 수정하거나 인자로 주면 된다. 기본값은 60초 이다.

AWS CloudFormation 보안 모범 사례

이 문서는 다음의 내용을 번역한 것입니다.

AWS CloudFormation을 사용하면 개발자와 시스템 관리자가 AWS와 연관된 리소스 모음을 질서있고 예측 가능한 방식으로 프로비저닝하고 업데이트하여 쉽게 생성하고 관리 할 수 ​​있다. 우리의 많은 고객들은 그들의 AWS 환경에서 변경사항을 간단하게 캡쳐하고 버전 제어를 실행하고 인프라에서 다른 작업 중에서도 비용을 관리하는 등에 모든 리소스를 제어하기 위해 CloudFormation 을 사용한다.

고객들은 자주 어떻게 CloudFormation 스택에 허가권을 제어하는 우리에게 묻는다. 이 글에서, 우리는 CloudFormation 에 대한 AWS Identity 와 IAM 정책을 사용, CloudFormation 에 특화된 IAM 조건 그리고 CloudFormation 스택 정책들을 포함하는 몇가지 모범사례를 공유한다. 대부분의 CloudFormation 배포는 AWS CLI 나 SDK 를 통해서 이루어지기 때문에 우리는 모범 사례를 어떻게 구현하는지 보여주기 위해서 AWS CLI 와 SDK 사용에 포커스를 둘 것이다.

IAM 을 통한 CloudFormation 스택 접근 제한

IAM 을 통해서, 여러분은 정책이나 사용자 혹은 롤(role) 을 사용함으로써 AWS 서비스나 리소스 접근을 보안적으로 통제할 수 있다. CloudFormation 은 fine-grained(세분화된) 액세스 제어를 제공하기 위해서 IAM 을 지렛대로 사용한다.

모범사례를 통해서, 우리는 최소 권한 원칙을 적용된 IAM 정책들을 통해 AWS 서비스 및 자원 접근을 제한하기 권한다. 이것을 하는 가장 단순한 방법은 CloudFormation 에 특정 API 콜을 제한하는 것이다. 예를들어, 여러분은 특정 IAM 유저나 롤이 CloudFormation 스택을 삭제하거나 업데이트하길 원하지 않을 것이다. 다음의 단수한 정책들은 모든 CloudFormation API 접근을 허용하지만 여러분의 프로덕트 스택의 UpdateStackDeleteStack API 접근은 거부한다.

IAM 정책은 종종 특정 리소스를 생성할 수 있도록 허용해야 하지만 이러한 리소스를 CloudFormation의 일부로 생성하지 않을 수 있다. 이것이 CloudFormation 의 IAM 조건 지원이 제공된다.

CloudFormation 을 위한 IAM 조건

다음은 여러분의 IAM 정책에 추가할 수 있는 세가지 CloudFormation 특화된 IAM 조건들이다.

  • cloudformation:TemplateURL
  • cloudformation:ResourceTypes
  • cloudformation:StackPolicyURL

이러한 세가지 조건을 통해서, 여러분은 특정리소스 생성, 업데이트, 특정 템프릿 사용등과 같은 스택 작업을 API 로 가능해지거나 스택 업데이트 중에 의도하지 않게 업데이트나 삭제가 될수 있는 스택 리소스를 방지하는 스택 정책을 사용해 특정 리소스를 제한할 수 있다.

Condition: TemplateURL

첫째 조건, Condition: TemplateURL, 생성, 업데이트, reside 등과 같은 스택 작업에 대해 CloudFormation 템플릿을 지정하도록 하고 그것만 사용하도록 강제한다. IAM 정책에서, 다음과 같다.

첫번째 구분은 지정된 템플릿에 한해서 모든 CreateStack 과 UpdateStack API 콜을 활성화 한다. 두번째 구분에서 모든 CreateStack 이나 UpdateStack API 콜들은 TemplateURL 파라메터를 반드시 포함하도록 한다. CLI 에서 여러분의 호출들은 –template-url 파라메터를 포함해야 한다.

Condition: ResourceTypes

CloudFormation 은 IAM 정책을 통해서 템플릿 생성, 업데이트에 리소스 타입을 제어할 수 있도록 해준다. CloudFormation API는 ResourceTypes 파라메터를 받는다. API 호출에서, 생성이나 업데이트할 수 있는 리소스 유형을 지정할 수 있다. 하지만, 새로운 ResourceTypes 파라메터를 사용하기 위해서는 다음과 같이 컨디션 조건을 추가함으로서 특정한 파라메터 사용이 가능하도록 IAM 정책을 수정할 필요가 있다.

CLI 에서, 여러분의 호출은 –resource-types 파라메터 포함할 필요가 있다. 여러분의 스택을 업데이트하기 위한 호출은 다음과 같다.

쉘(Shell)에 따라서 명령어는 쌍따옴표를 사용해야할 수도 있다. 그렇지 않으면 “No JSON object could be decoded” 에러를 보게 될 것이다.

ResourceTypes 조건은 CLI 나 API 호출을 통해서 CloudFormation 이 올바른 리소스 타입과 템플릿을 생성, 업데이트 하도록 합니다. 첫번째 예제에서, 우리의 IAM 정책은 AWS::IAM 리소스를 포함한 예제였기 때문에 API 호출을 차단했을 것이다. 만약 우리의 템플릿이 오직 AWS::EC2::Instance 자원만 포함한다면, CLI 명령어는 다음과 같을 것이며 성공할 것입니다.

세번째 조건은 StackPolicyURL 조건이다. 어떻게 동작하는지 설명하기 전에, 우리는 스택 정책에 대해 몇가지 추가적인 컨텍스트를 제공할 필요가 있다.

Stack Policies

가끔, 최악의 운영 중단은 의도되지 않은 리소스에 변경으로 발생 된다. 이 리스크를 완화하는데 도움이 되기 위해, CloudFormation 은 스택 정책들을 제공는데 이것은 스택 업데이트 중에 의도치않은 업데이트나 삭제로부터 스택 리소스들을 보호해준다. IAM 과 함께 사용할 경우, 스택 정책들은 스택 리소스에 대해 악의적이고 의도치않은 변경 모두에 대해 두번째 방어 계층을 제공 한다.

CloudFormation 스택 정책은 스택 업데이트 작업의 일부로 업데이트할 수 있는 항목을 정의하는 JSON 문서다. 정책을 지정하거나 업데이트하기 위해서, 여러분의 IAM 사용자 혹은 롤(Role)은 반드시 우선적으로 Cloudformation::SetStackPolicy 액션을 호출 할 수 있어야 한다.

여러분 스택에 직접 스택 정책을 적용한다. 주의해야할 것은 이것은 IAM 정책이 아니다. 기본적으로, 스택 정책 설정은 명시적으로 Allow 지정하지 않는 한 업데이트를 거부하기 위해 Deny 를 사용해 모든 스택 리소스들을 보호한다. 이것은 만약 오직 몇가지 리소스들만 제한 하길 원한다면, 리소스 “*” 를 사용해 Allow 를 포함으로써 모든 업데이트를 반드시 명시적으로 허용해야 하며 특정 리소스를 Deny 해야 한다.

예를들면, 스택 정책은 라이브로 진행되는 데이터를 포함하고 있기 때문에 프로덕션 데이터베이스를 보호하는 데 종종 사용된다. 변경중인 필드에 따라 업데이트중에 전체 데이터베이스를 교체할 수 있는 경우가 있다. 다음의 예제는, 스택 정책은 명시적으로 프로덕션 데이터베이스 업데이트 시도를 거부한다.

여러분은 모든 RDS DB 인스턴스나 주어진 ResourceType 을 포함하도록 여러분의 스택 정책을 일반화 할 수 있다. 이것을 얻기 위해서는 컨디션 사용한다. 그러나, 우리의 예제는 와일드카드를 사용했기 때문에, condition 은 반드시 “StringEquals” 이 아닌 “StringLike” condition 을 사용해야 한다.

스택 정책에 대한 보다 많은 정보는  Prevent Updates to Stack Resources 참고하라.

마지막으로, 여러분의 모든 스택에 알맞은 미리 정의된 스택 정책을 가지고 있는지를 확인해라. 이것을 해결할려면 IAM 정책을 봐야 한다.

Condition:StackPolicyURL

여러분의 IAM 정책 내에서, 여러분은 모든 CloudFormation 스택이 StackPolicyURL 조건을 가지고 생성된 것과 연결된 스택 정책을 가지는지를 확인할 수 있다.

이 정책은 SetStackPolicy 가 호출될때마다 반드시 스택 정책 URL 이 지정되어 있는지 확인한다. 이 경우에, URL 은 https://s3.amazonaws.com/samplebucket/sampleallowpolicy.json 다. 유사하게, 모든 생성과 업데이트 스택 연산에서, 이 정책은 StackPolicyURL 은 S3 에 sampledenypolicy.json 문서로 지정되었고, StackPolicyURL 은 항상 지정된다. CLI 에서 create-stack 명령어는 다음과 같다.

주의해야 할 것은 만약 스택 업데이트에 새로운 스택 정책을 지정한다면, CloudFormation 은 이미 있는 스택 정책을 사용한다. 새로운 정책은 오직 이후 업데이트에만 새 정책을 사용한다. 예를들어, 현재 정책이 모든 업데이트를 거부하도록 지정되어 있다면, 딱 한개 업데이트를 허용하기 위해서 스택정책을 변경할려면 반드시 SetStackPolicy 명령어를 실행해야 한다. 그리고 여러분은 스택에 대해서 업데이트 명령어를 실행할 수 있다. 이미 생성된 스택 업데이트를 위해서 다음과 같이 실행 할 수 있다.

그리고 업데이트를 실행할 수 있다.

우리가 사용하는 IAM 정책은 스택이 생성 혹은 업데이트 될때마다 스택에 적용되어질 특정한 스택 정책을 보장한다.

Conclusion

CloudFormation 은 연관된 AWS 리소스를 생성, 관리하는 반복적인 방법을 제공한다. IAM 정책, 사용자, 롤, CloudFormation-specific IAM condition, 스택 정책을 조합해 사용함으로써, 여러분은 CloudFormation 스택을 의도한데로 사용하고 잘못된 업데이트, 삭제를 최소할 수 있다.

You can learn more about this topic and other CloudFormation best practices in the recording of our re:Invent 2015 session, (DVO304) AWS CloudFormation Best Practices, and in our documentation.

AWS EKS 클러스터 셋업

How to setup

AWS 의 EKS Cluster 를 셋업할 수 있는 방법에는 다음과 같다.

  • AWS Management Console
  • eksctl utility provided by AWS
  • IaC (Terrform, Ansible)

여기서는 AWS Management Console 를 이용한 방법을 사용할 것이다.

Prerequirement

AWS 를 사용하기 위해서는 권한이 있어야 한다. 다음과 같은 권한이 일단 필요하다.

  • AWS Account with Admin Privileges
  • AWS Cli Access to use Kubectl utility
  • Instance (To manage cluster by using Kubectl)

AWS 계정은 될수 있는한 관리자 권한이 필요하다.

Create IAM role for EKS Cluster

EKS Cluster 를 위한 IAM를 생성해야 한다. 이것은 IAM 서비스에서 역할(Role) 을 이용해서 생성한다.

각각의 허가권(Permission) 을 설정할 필요 없이 사용사례선택에서 EKS – Cluster 를 선택하고 Role 이름을 설정하면 끝나게 된다.

다음으로 일반 사용자가 이 Role 을 위임받을 수 있도록 신뢰관계를 맺어준다.

systemv 사용자에 대해서 신뢰관계를 만들어 줬다.

Create Dedicated VPC for the EKS Cluster

VPC 를 생성해야 하는데, 하나하나 생성할 수도 있다. 하지만, EKS 를 위해서 AWS 는 CloudFormation 템플릿을 제공하고 있다. 이 정보는 다음의 링크를 통해서 확인할 수 있다.

위 내용을 보면 S3 에 CloudFormation 용 템플릿을 제공한다. 이를 이용하면 손쉽게 VPC 를 생성할 수 있는데 생성되는 리소스는 대략 다음과 같다.

  • 퍼블릭 서브넷 2개, 모든 서브넷에는 로드밸런서 할당을 위해 태그가 지정된다.
  • 엘라스틱 IP 할당.
  • 프라이빗 서브넷 2개, 모든 서브넷에는 내부 로드밸러서 할당을 위해 태그가 지정된다.
  • NAT 게이트웨이 1개
  • 모든 인바운드 트래픽을 차단하고 아웃바운드 트래픽을 허용하는 보안그룹.

AWS EKS 는 Master Node, Worker Node 로 구성되는데, Master Node 는 Managed 서비스이며 이것은 퍼블릭 서브넷이 필요하게 된다. Worker Node 는 EC2 인스턴스에 Docker 가 설치되며 EKS 에 의해서 제어된다. 이것은 프라이빗 서브넷이 필요하게 된다.

모든 인바운드 트래픽은 차단되고 아웃바운드 트래픽을 허용하기 위해서 NAT 게이트웨이가 설치가 된다.

CloudFormation 을 이용해 이런 제반사항들을 손쉽게 만들 수 있다.

AWS EKS 생성을 위한 CloudFormation 스택 이름 변수 정하기
AWS EKS 생성을 위한 CloudFormation 스택 이름 변수 정하기

스택이름만 쓰고 나머지는 그냥 기본적으로 제공하는 값을 사용해도 된다. 다음화면에서 태그나 기타 필요 옵션등을 선택할 수 있는데, 아무것도 안하고 넘어가도 된다.

CloudFormation 을 이용한 AWS EKS VPC 생성완료
CloudFormation 을 이용한 AWS EKS VPC 생성완료

생성된 자원들을 보면 어떤 것을 생성했고 어떻게 연결을 했는지도 눈에 보인다. SecurityGroup 은 ControllPlane 에 접근을 위해서 만들어졌다.

Login AWS Account for creating Cluster

앞에 CloudFormation 작업은 AWS Root 계정으로 진행 된다. 어짜피 네트워크 작업이며 이를 제어하기 위한 퍼미션만 사용자가 가지고 있어도 되기 때문이다. 하지만 서비스는 다르다. 서비스는 Role 기반으로 작동되는 경우가 많아 반드시 일반 계정으로 생성을 해야 한다.

만일 AWS Root 계정으로 EKS Cluster 를 생성할 경웨 피고한 경우가 생길 수 있다. 따라서 반드시 일반 계정으로 로그인을 해준다. 그 계정에 다음과 같은 정책을 생성해 준다.

EKS Cluster 를 위한 권한이 대부분 다 들어 있다.

Create EKS Cluster

이제 네트워크 환경이 모두 구성됐으니 EKS Cluster 를 만들어야 한다. AWS 콘솔에서 EKS 를 검색해 서비스로 이동하면 된다.

AWS EKS Cluster 기본정보 입력
AWS EKS Cluster 기본정보 입력

Kubernetes 버전은 최신버전으로 했지만, 실제 서비스 운영은 기본값을 사용하길 권장한다. 클러스터 서비스 역할에는 맨처음에 만들었던 역할을 지정해 주면 된다.

AWS EKS Cluster 네트워킹 지정
AWS EKS Cluster 네트워킹 지정

네트워킹은 CloudFormation 으로 생성한 네트워크를 지정해 줘야 한다.

AWS EKS Cluster 클러스터 엔드포인트 액세스
AWS EKS Cluster 클러스터 엔드포인트 액세스

클러스터 엔드포이트 액세스는 퍼블릭 및 프라이빗으로 선택한다. 그리고 Amazon VPC CNI 는 최신버전으로 선택.

AWS EKS Cluster 클러스터 로깅
AWS EKS Cluster 클러스터 로깅

CloudWatch Logs 는 비활성화해서 넘어간다. 단, 실제 서비스를 운영할때는 활성화를 해준다. 적어도 Authenticator 정도는 해준다.

Install & Setup IAM Authenticator and Kubectl Utility

설치 aws-iam-authenticator 문서를 보고 authenticator 를 설치해 준다.

AWS EKS 를 위한 kubectl 명령어를 다운로드 받는다.

설치된 Client 버전과 AWS EKS 에서 버전이 같은지 확인한다.

이제 kubectl 명령어가 사용되는지를 확인해 본다.

접속을 위한 아무런 정보가 없기 에 localhost 에 접속을 시도했다.

접속을 위한 정보를 받아서 $HOME 에 .kube/config 에 저장이 된다. 이제 잘되는지 다음과 같이 확인해 보자.

위와같이 나오면 정상이다. 만일 위와같이 나오지 않는다면 Role 를 지정해줄 수도 있다.

이렇게 했는데도 안된다면 다음의 링크가 도움이 될지 모른다.

정상적으로 작동한다면 다음과 같이 Node 는 아무것도 안나올 것이고 Namespace 는 나올 것이다.

Create IAM Role for EKS Worker Nodes

EKS Cluster 는 Kubernetes 에서는 Master 작업이 끝난것이라고 보면 된다. 아직은 Work Node 가 없다. Work Node 는 NodeGroup 으로 묶여서 생성되고 Work Node 를 위한 Role 이 필요하다.

AWS Role for EKS WorkNodes
AWS Role for EKS WorkNodes

이와 더블어서 ssm.amazonaws.com, eks.amazonaws.com 을 신뢰관계에 추가 해준다.

많은게 필요가 없다. 이제 worknode 를 위한 group 를 생성해 보자.

AWS EKS WorkGroup 생성하기 - 기본정보 입력
AWS EKS WorkGroup 생성하기 – 기본정보 입력

이름과 역할을 지정해준다. 역할은 앞에서 생성한 역할이 자동으로 나올 것이다.

AWS EKS Workgroups 생성하기 - 컴퓨터 자원 생성
AWS EKS Workgroups 생성하기 – 컴퓨터 자원 생성

서비스 운영을 위한 시스템 자원을 선택해 준다. 이 시스템 작원은 물리적인 하드웨어를 선택하는 것이다. 이 자원 위에서 Docker 를 기반으로 Micro Service 가 돌아가게 된다.

AWS EKS Workgroups 설치하기 - 네트워크 설정
AWS EKS Workgroups 설치하기 – 네트워크 설정

서브넷은 AWS EKS 를 위한 서브넷을 선택되어 있어야 한다. 노드에 대한 액세스가 필요할 경우에 해주면 되고 보안 그룹은 기본보안 그룹(22 port 만 열려 있다)을 선택해 줬다. 서비스를 운영할때에는 적절하게 바꿔준다.

생성이 완료되면 다음과 같이 Node 가 나오게 된다.

이것이 Kubernetes 에서 Master, Work node 작업이 완료된것과 같은 AWS EKS Cluster 가 세팅이 완료가 된 것이다.


이 글은 초기버전이다. 큰 틀에서 대충 이렇게 한다는 것을 보여주는 것 외에는 깊이가 없다.

Nginx 액세스 로그를 CloudWatch Logs Agent 로 보내기

이 글은 다음의 글을 번역한 것입니다. 저작권은 원작자에게 있습니다.

최근에 나는 Ubuntu 18.04 에서 CloudWatch Logs 를 어떻게 설정하는지에 대한 글을 썼다. 그 글에서 나는 Agent 가 */var/log/syslog* 를 CloudWatch Logs로 syslog log 파일을 푸쉬하도록 설정했다. 이전 글을 보고 여기로 오길 바라고 혹시나 여러분이 Ubuntu 를 사용하지 않는다면 여러분이 사용하는 OS 에 CloudWatch Logs Agent 를 설치하기 위해서 AWS 문서를 체크해야 한다.

여기서 나는 Nginx 의 액세스 로그(access log) 와 에러 로그(Error log) 를 AWS CloudWatch Logs Agent 를 통해서 CloudWatch Logs 로 어떻게 전송하는지를 보여줄 것이다.

우리는 에이전트가 소비하기 원하는 두개의 Nginx 로그 파일을 가진다고 가정하자: */var/log/nginx/access.log**/var/log/nginx/error.log* 로 원하는 만큼 많은 Nginx 로그를 추가할 수 있다.

AWS CloudWatch Logs Agent 는 *amazon-cloudwatch-agent.json* 파일로부터 설정들을 가지고 오고 이것은 Ubuntu 에서 */opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json* 위치해 있다.

이미 파일이 그곳에 있을거라 생각하고 collect_list 배열 아래쪽에 다음을 추가하면 된다.

여기서 핵심은 Nginx 로그 파일에서 timestamp_format 과 일치하는 포맷을 찾는다는 것이고, 만약 Ubuntu 에서 Nginx 에 기본 로깅 설정을 사용중이라면 위 설정은 잘 맞는다.

또 log_group_name 이 CloudWatch Logs Agent 의 자격증명에 로그 스트림 생성을 위한 logs:CreateLogSteam, 로그 스트림 기술을 위한 logs:DescribeLogStream 그리고 로그 이벤트를 푸쉬하기 위한 logs:PutLogEvents 의 IAM 허가권을 가지는 로그 그룹과 일치하는지 확인해봐야 한다.

amazon-cloudwatch-agent.json 파일을 업로드 한 후에 agent 서비스를 재시작해줄 필요가 있다:

곧바로 CloudWatch Logs 에서 Nginx 로그들이 표시된다.

Ubuntu 18.04 LTS 에 CloudWatch Logs Agent 설정하기

이 글은 다음의 글을 번역한 것입니다. 저작권은 원작자에게 있습니다.

AWS CloudWatch Logs Agent 는 서버로부터 AWS CloudWatch Logs 서버로 로그를 전송하기 위해 설정될 수 있다. 이 문서에서, 나는 어떻게 Ubuntu 18.04 LTS 에 어떻게 설정하는지 보여줄 것이지만 여러분은 Ubuntu16.04 혹은 다른 운영체제 에서도 유사한 절차를 따를 수 있다. CloudWatch Logs Agent 는 Windows Servers 에서 EventViewer 로그를 수집하기 위해 설정할 수도 있다.

아주 좋은것은 여러분이 AWS EC2 를 실행하지 않는다고 하더라도, Azure, Google Cloud, Linode, Digistal Ocean 등과 같이 어떤 서버든지 이 기술을 사용할 수 있다는 점이다. 이 문서는 여러분이 따라하기에 쉬운 간단한 샘플이다.

여러분은 이러한 절차를 설정관리 스크립트로 손쉽게 만들거나 자신만의 Docker 이미지 사용을 위해 Dockerfile에 추가할 수 있어야 한다.

Download / Install the Debian Package

AWS 는 그들의 문서에 CloudWatch Logs Agent 데미안 패키지 위치를 기술하고 있고 우리는 curl 을 이용해 다운로드하고 실행하면 된다.

이 문서의 모든 명령어는 sudo 를 사용허거나 root 사용자로 실행하는 것으로 한다.

Add cwagent User to adm group

다음으로 우리는 설치 프로그램이 생성한 cwagent 리눅스 사용자 계정을 Ubuntu 시스템 로그들에 읽기 허가권을 주기 위해서 adm 그룹에 추가하는 수정작업을 할 것이다.

Setup an IAM User Account and Permissions

이제 우리는 여러분의 AWS 계정에 CloudWatch Logs 에 로그 데이터를 전송하기 위해 Ubuntu 서버에 허가권을 부여할 필요가 있다.

만약 AWS EC2 운영하고 있다면, 이 과정을 건너뛰고 Assumed Role 를 사용해라. 하지만 IAM 허가권을 가진 Assumed Role 이 있는지 확인할 필요가 있다.

AWS Console 에서 IAM 사용자를 생성하고 AWS accessID 와 AWS secretKey 를 기록하고 여러분의 Ubuntu 서버에서 다음과 같이 /home/cwagent/.aws/credentials 파일을 생성하십시오.

또, 다음과 같이 /home/cwagent/.aws/config 파일을 생성하십시오

AWS console 에서 만든 새로운 IAM user 의 aws_access_key_id 와 aws_secret_access_key 를 사용해야 해야하며 region 또한 정확하게 지정해야 한다. 다음과 같이 /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml 에 추가함으로써 인증을 위해 CloudWatch Logs Agent 가 여기를 바라보도록 한다.

Create a Log Group

어떻게 로그들을 구성하길 원하는지에 대해서 잠깐 동안 생각해봐야 한다. CloudWatch Logs 는 Log Groups 과 Logs Streams 개념을 제공한다. 로그 그룹을 로그별로 다이나믹하게 생성하거나 하나의 로그 그룹에 모든 서버 로그들을 사용할지와 같은 것이다. 이 문서에서 우리는 hostname.example.com/syslog 와 같은 로그 스트림을 생성하는 여러 서버에 대한 로그를 가질 수있는 하나의 로그 그룹을(web-server-log-group) 생성할 것이다.

나는 단일 로그 그룹에 스트림을 생성하고 로그를 출판하기 위한 접근만 제공하기 위해 IAM 허가권을 제한할 수 있기 때문에 이러한 접근방법을 선호한다.

Grant the IAM User / Role Permission to Publish Logs

web-server-log-group 으로 명명된 로그 그룹을 가지고 있다고 가정하고 이전 절차에서 생성한 IAM user에 IAM 정책(Policy) 를 붙일 것이다. 만약 EC2 를 운영중이라면 Assumed Role 에 이 정책을 붙일 수 있다.

주의해야 할 것은 숫자 1234567890 는 여러분의 AWS account id 로 바꿔야 한다. 만약 CPU, Memory, Network, Disk 와 같은 서버 메트릭 데이터를 CloudWatch Logs Agents 가 출판하길 원한다면 다음과 같이 cloudwatch:PutMetricData 허용을 위해 추가적인 정책을 붙일 필요가 있다.

나도 리소스(Resource)에 대해 와이들카드(*) 를 사용하는 대신에 좀더 제한적일 수 있는지 좀 더 찾아봐야 한다.

또, AWS 는 여러분이 사용할 수 있도록 CloudWatchAgentServerPolicy 으로 명명된 이미 만들어진 정책을 제공한다. 하지만 개인적으로 이건 조금 과도한 허가권이라 생각한다. 이것은 Agent 가 새로은 로그 그룹과 모든 로그 그룹에 로그를 출판하도록 서버에 허가한다.

Telling CloudWatch Logs Agent Which Log Files to Collect

AWS CloudWatch Logs Agent 는 위자드(Wizard) 를 통해서 json 설정 파일 생성을 위해 실행할 수 있는 툴을 가지고 있다:

아니면 이 위치에: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json 수동으로 JSON 파일을 생성할 수 있는데 다음과 같다.

이것은 Ubuntu 서버의 /var/log/syslog 의 내용을 AWS CloudWatch Logs 서비스로 출판 한다. 여기에 nginx 로그를 CloudWatch Logs로 전송하는 예제가 있다.

Enable and Start the CloudWatch Logs Agent service

마지만 단계로 AWS CloudWatch Logs Ubuntu 서비스를 활성화 해주고 서비스를 시작해준다. 이것은 다음의 두개 명령어로 실행할 수 있다.

AWS CDK 개발 환경 구축하기

이 문서는 AWS CDK 개발 환경 구축에 대한 글이다. AWS CDK 는 코드로 AWS 자원을 관리하게 해주는 것으로 Infrastructure As Code 에 부합한다. 이를 사용하기 위해서는 환경 구축이 필수이기에 이를 기록한다.

구축 환경

AWS CDK 는 몇가지 언어를 지원 한다. 나는 Python 을 사용할 것임으로 Python 관련된 설정도 필수다. 그런데, Python 을 사용해보면 알겠지만 Windows 플랫폼 보다는 Unix 스타일의 플랫폼이 적합하다는 것을 알게 된다. 따라서 구축 환경은 다음과 같이 정했다.

  • OS: Mint Linux 19.3 Tricia XFCE
  • Python3

한가지 더 있다. Python3 을 사용할 경우에 AWS SDK 등을 모두 설치해야 한다. 하지만 Python 은 캡슐화를 지원한다. Virtualenv 가 바로 그것인데, 모든 것을 Virtualenv 환경으로 구축을 할 예정이다.

PreRequirement

이제 본격적으로 구축을 해보자. 이를 위해서 필수 프로그램이 필요한데, 이는 다음과 같다.

  • npm (Node)

이는 다음의 URL 을 명시되어 있다.

Node, npm 설치

npm 을 기반으로 한다고 문서에 나와 있다. 따라서 npm 을 설치해 줘야 한다. npm 은 Node.js 기반이며 Node.js 를 설치하는 방법은 다양하지만 이전에 이에 대해서 기술한 문서가 이미 있기에 다음을 참고 했다.

주의할 것은 AWS 의 문서에 나와 있다시피 LTS 버전을 설치해줘야 한다. AWS 문서에 나와 있듯이 CDK 를 설치해 준다.

Python3 환경 구축

Python3 에도 필요한 것이 있는데, distutils 패키지 이다. 이것은 우분투 패키지로 설치를 해줘야 한다. 다음과 같이 설치를 해준다.

이것을 설치해야지만 python3 을 로컬 계정에서 환경을 구축할 수 있다. 다음과 같이 pip 를 설치해 준다.

virtualenv 를 설치하고 난 후에 이제 캡슐환경을 만들어준다. 그냥 .python3 으로 만들어준다.

여기서 이제 AWS CLI 와 기타 몇가지를 함께 설치해준다. 이는 Python3 에 패키지로 존재함으로 pip 명령어를 이용해서 설치하면 된다.

이로써 필수 프로그램 설치는 다 됐다.

VS Code 설정

이제 Editor 설정을 해야 한다. VS Code 라면 AWS CDK 를 사용하는데 부족함이 없다. 데스크탑 리눅스를 사용함으로 VS Code 에서 우분투 패키지를 다운로드해 설치하면 된다.

Color Themes

좋은 Color Themes 가독성을 높여줘 프로그래밍을 하는데 많은 도움이 된다. 내가 주로 사용하는 Color Themes 는 다음과 같다.

  • Ayu
  • Primal

물론, 이건 지극히 개인적인 것임으로 검색을 통해서 자신에게 맞는 Color Themes 를 찾으면 된다.

Python Extension 설정

VS Code 가 Python 을 지원하도록 해야 한다. 이를 위해서 Python Extension 을 설치하고 다음과 같이 설정을 해준다. 그리고 다음과 같이 pip 를 이용해서 프로그램을 설치해준다.

AWS Toolkit for Visual Studio Code

AWS Tookit Extension 을 설치해 준다. 별도의 설정은 해주지 않아도 된다.

Indenticator, indent-rainbow

Python, Yaml 문법의 특성상 Indent 를 기반으로 문법 체크를 하는데 이 Extension이 도움이 된다.

Sort lines

라인을 알파벳 순, 숫자순으로 정렬을 해준다.

vscode-cfn-lint

cfn 는 CloudFormation 을 말한다. CloudFormation 문법을 체크해 준다.

YAML Support by Red Hat

CloudFormation 은 YAML 문법을 따른다. 이 문법을 체크해 준다.

Cloudformation YAML snippets for VS Code

코딩을 할때에 필요한 코드 조작을 넣어준다.

Better Comments

주석에 색깔을 입혀서 가독성을 높여준다.

이렇게 설치한 Extension 에 대한 설정값은 다음과 같다.

AWS Credential 세팅

Python3 에 가상환경에서 aws configure 명령어를 이용해서 접속을 위한 credential 을 만들어준다.

이로써 AWS CDK 를 위한 VS Code 설정을 기술했다. 정답은 없다. 개인적으로 사용하는 설정을 기반으로 보다 좋은 방법, 환경을 위한 설정이 있을 것이다.

Ansible, ec2.py 를 이용한 Dynamic Inventory 활용

Ansible 에는 접속 정보와 관련된 정보들을 Inventory 라고 부른다. 접속 호스트, 접속 계정 정보뿐만 아니라 이들을 그룹으로 묶거나 변수 설정도 가능하다.

그런데, 클라우드 시스템과 같이 서버 관련 정보를 API 형식으로 제공할 경우에 일일이 호스트 정보를 파일로 저장할 필요가 없다. 클라우드 시스템에 서버 관련 정보를 호출하며 자동으로 Inventory 정보가 생성되는 기능을 제공하는데 이를 Dynamic Inventory 라고 한다. 이 기능은 클라우드 뿐만 아니라 LDAP 과 같은 인증 시스템에도 활용가능하다.

Ansible 세팅

AWS 클라우드의 Dynamic Inventory를 활용하기 위한 Ansible 을 세팅해 보자. 가장 중요한 ansible.cfg 는 다음과 같다.

특별히 inventory 에는 AWS 클라우드에 제공하는 Dynamic Inventory 스크립트 위치를 지정해준다. ansible 을 이용한 접속 정보, 실행할 계정에 대한 정보등을 기재한다.

디렉토리는 구조는 대략 다음과 같다.

AWS 클라우드 Dynamic Inventory 파일

AWS 클라우드의 경우에도 Ansible 의 Dinamic Inventory 기능을 제공한다. 작동원리는 AWS 자원 정보를 불러오고 이것을 Ansible 이 인식하는 Inventory 정보를 구성하는 것이다. AWS 자원 정보를 불러오기 위해서 AWS 는 다음과 같은 스크립트와 환경설정 정보를 제공한다.

ec2.py 는 AWS 클라우드 시스템에 호스트 관련 정보를 불러오도록 한다. ec2.ini 는 어디, 어떤 정보를 불러올 건지 어떤 내용을 출력할 것인지를 지정할 수가 있다. 예를들면 다음과 같다.

regions 이 기본값은 all 이다. 이러면 모든 리전에 대해서 호스트 정보를 수집할려고 하기 때문에 시간이 오래걸리는 문제가 발생한다. 특정한 리전에 대해서만 수행하도록 지정하는 것이 좋다.

IAM 설정

가장 중요한것이 IAM 설정이다. Ansible 을 실행하는 서버에는 호스트 정보를 불러올수 있는 IAM 권한이 필요하다. 보통 IAM Role 지정이라고 하는데 대략 다음과 같은 Policy 를 만들어 Role 적용을 하면 된다.

Access Key, Secret key 를 이용하는 방법도 있지만 권장하지 않는다.

ec2.py 테스트 및 특징

이제 요건이 갖춰졌으니 테스트를 해보자.

내용을 보면 위와같은 key 값들을 보게 된다. 집작했겠지만 ec2.py 는 ec2 인스턴스의 tag 를 key 로 지정해준다. tag 뿐만 아니라 ec2 인스턴스의 정보를 key 만들어준다.

이 key들은 Ansible Inventory 의 group 변수로 활용이 가능하다.

ec2 key pair 를 이용한 접속 정보 만들기

ec2.py 에서 key 들은 곧바로 Ansible 의 group 으로 활용 가능하다. 이를 위해서 inventory/production/group_vars 디렉토리에 key 이름으로 yaml 파일을 생성한다. 그리고 다음과 같이 내용을 입력한다.

Ansible이 그룹 접속을 할때에 위 변수를 활용하게 된다. AWS 클라우드 ec2 접속하기 위한 keypair 를 이용하는데 따른 설정이다.

접속 테스트

이제 다 됐다. 다음과 같이 접속 테스트를 한번 해본다.

위와같이 나오면 성공한 것이다.

AMAZON S3 버킷 램덤화 객체 접두사 불 필요.

과거에 AMAZON S3 버킷 성능 끌어올리기 라는 글을 통해서 S3를 사용하는데 있어서 성능향상 방법에 대해서 설명한 적이 있다. 핵심은 객체 접두사를 램덤화해서 S3에 올라가는 파일들이 균일하게 넓게 퍼질 수 있도록 해야한다는 것이였다.

하지만 2018년 7월 17일에 AWS 에서는 S3에 성능향상을 언급하면서 이제 객체 접두사의 랜덤화는 불필요하다고 말했다.

Amazon S3, 요청 처리 성능 개선 발표

이 같은 S3 요청 처리 성능 향상으로 인해 객체 접두사를 랜덤화하여 더 빠른 성능을 실현하라는 이전의 지침은 더 이상 적용되지 않습니다. 즉, 이제 성능 저하 없이 S3 객체에 논리적 또는 순차적 명명 패턴을 사용할 수 있습니다. 이 성능 향상은 이제 모든 AWS 리전에서 제공됩니다. 자세한 내용은 Amazon S3 개발자 가이드를 참조하십시오.

이제 S3 버킷에서 객체를 저장할때 접두사를 램덤화하려는 고민을 하지 않아도 된다.