[컴] Airflow 에서 일정기간 후에 log 를 지우는 법

 

log retention / 보존기간 설정 /

Airflow 에서 일정기간 후에 log 를 지우는 법

기본적으로 airflow 에서 지원하는 retention 설정은 없는 듯 하다. 다음 글들에서는 airflow 를 이용해서 주기적으로 airflow 의 log 를 지우는 방법을 보여준다.

  1. A Simple DAG to Quickly Purge Old Airflow Logs | by Christine Betadam | EatCodePlay
  2. python - Configure logging retention policy for Apache airflow - Stack Overflow

airflow.cfg 를 변경후 server restart

설정에 따라 다르다는 듯, 어떤 값들은 reload 하려면 airflow 를 restart 해야 한다.

airflow restart 방법

kill -HUP <scheduler_process_id>
kill -HUP <webserver_process_id>

nohup airflow webserver --port 8080 1> /dev/null 2>&1 &
nohup airflow scheduler 1> /dev/null 2>&1 &
  • airflow scheduler -- DagFileProcessorManager 이 죽지 않는 경우가 있다. 이 경우는 수동으로 kill 해주자. 참고로 scheduler 가 떠 있으면, ‘DagFileProcessorManager’ 를 kill 해도 다시 실행된다.
  • webserver 는 ‘airflow webserver’ 가 아닌 ’gunicorn’을 kill 한다.

[컴] AWS IAM policy 설정관련 참고자료

 

aws iam 정책 설정

AWS IAM policy 설정관련 참고자료

IAM policy 를 설정은 AWS management console 에 대한 세부적인 제어는 어렵다.

현재 시도해본 바로는 list 에 대한 설정은 힘들다. 즉, 같은 region 에 있는 ec2 나 rds 등의 list 를 보여줄때 내가 원하는 것만 보여주도록 하고 싶었으나, 실패했다. 

시도해 보진 않았으나, region 으로 구분해서 작업하면 좋은 결과가 나올 수도 있을 듯 싶다.

내가 원하는 service에만 권한을 주면 list 가 보이지 않았다.

여기에서도 이야기지만, 모든 action 이 resource level 로 되어 있지 않아서 쉽지 않은 듯 하다.

자세한 사항은 Example policies for working in the Amazon EC2 console - Amazon Elastic Compute Cloud 를 읽어보는 것이 도움이 될 듯 하다.

[컴] kafka outbox pattern, Transactional outbox pattern

debzium /

kafka outbox pattern, Transactional outbox pattern

분산시스템에서 2번 write 되는 상황을 해결해준다.

예를 들어, 하나의 작업(operation) 이 ‘db write opertion’ 과 ‘message notification’ 을 갖고 있는 작업이라면, db 에 한번, message 쪽에 이렇게 두번의 write 를 해야 한다.

이 경우 failure(실패)가 날 때 data 의 일관성이 깨진다.(inconsistent), 그래서 이 작업은 atomically 하게 이뤄져야 한다.

예를 들어보자, 만약 가입을 완료하면, 가입완료 email을 보내는 작업이 있다고 하자.

  1. user table에 row를 만들고,
  2. email worker에게 email 을 보내라고 한다.(email event)

우리는 user 가 생성됐다면, email 이 나갔다고 확신하고 싶지만, 위 2개중 1개가 실패하면 data 가 inconsistent 하게 된다.

1. DB table 을 이용

outbox table 을 하나 만들고, email event 를 저장한다.(timestamp, sequence number), 그리고 이 table 의 변동사항을 보고, kafka event 를 보내는 것이다.(당연히, 이 작업을 하는 worker가 필요하다.)

2. Change Data Capture(CDC)를 이용하는 방법

여긴 outbox 에 표시를 하고, 그러면 그것이 transaction 이 log 에 기록되고, 이 log 의 Change Data Capture(CDC)를 보고, kafak event 를 보내는 방법을 취한다.

다만 위 2개의 글에서 이야기하는 방식은 ref.1 에서 이야기하는 Using CDC 와 조금 차이를 보인다.

ref.1 에서는 user table 의 row 가 만들어지면, 그것에 대한 binary log 등을 CDC로 사용해서 kafka 에 event 를 보내도록 한다. 하지만 위의 2개의 글에서는 user table 에 insert 가 끝나고, outbox table 에 다시 insert 를 하게 하고, 그 outbox table 의 CDC 를 이용해서 kafka를 보낸다.

둘다 틀린 접근은 아니다. db 에 기록을 남기느냐 마느냐는 선택의 문제인듯 하다.

kafka 에 send 를 확인하고 나서, user table 을 insert 하는 방식

’kafka 에 send 를 확인하고 나서, user table 을 insert 하는 방식’은 어떨까 ?

이것의 문제는 kafka send 가 성공하고나서, user table의 insert 가 실패하는 경우다. 이 경우 rollback 이 불가능하다.

See Also

  1. 강남언니, 분산 시스템에서 메시지 안전하게 다루기

Reference

  1. Transactional outbox pattern - AWS Prescriptive Guidance

[컴] rust llama-chat.wasm 을 wasmedge 에서 실행

rust llama-chat.wasm 을 wasmedge 에서 실행

wasmedge, rust llama-chat 을 실행하는 이야기다. ref. 2 를 확인하면 된다.

여기서는 ref.2 의 내용을 직접 해봤다.

실행한 사양

  • windows wsl2 의 ubuntu 20.04
  • ram 16gb
  • cpu i5-9400F @ 2.90GH

짤막한 소감

wsl2 여서 그런지 gpu 인식을 제대로 안됐다. 그래서 CPU 만으로 추론(inference)이 된다.

개인적으로 wsl2의 memory 는 대략 8GB까지 올라갔다.

1번째 질문은 1분내에 응답을 했다. 다만 2번째 질문부터는 5분정도 기다려도 답변이 나오지 않았다.

실행

curl -sSf https://raw.githubusercontent.com/WasmEdge/WasmEdge/master/utils/install.sh | bash -s -- --plugin wasi_nn-ggml
# After installing the wasmedge, you have to activate the environment.
# Assuming you use bash (the default shell on Ubuntu), you will need to run the following command
source $HOME/.bashrc

pre-built Wasm app

curl -LO https://github.com/second-state/llama-utils/raw/main/chat/llama-chat.wasm
sudo apt update
sudo apt install -y libopenblas-dev
wasmedge --dir .:. --nn-preload default:GGML:AUTO:llama-2-7b-chat-q5_k_m.gguf llama-chat.wasm

Reference

  1. WasmEdge-WASINN-examples/wasmedge-ggml-llama-interactive/README.md at master · second-state/WasmEdge-WASINN-examples · GitHub
  2. Fast and Portable Llama2 Inference on the Heterogeneous Edge

[컴] AWS 의 instance에서 IAM role 사용

security credential, IAM role

AWS 의 instance에서 IAM role 사용

AWS의 instance에서 IAM role 을 사용할 수 있다. 예를 들어 EC2에서 s3를 사용할때 access key 를 발급받고, 그것을 instance 에 넣고, 그것을 application 이 사용하게 된다. 그런데 이 IAM role 을 사용하면, 실제적으로 application 이 access key 를 사용하는 것과 비슷하게 주기적으로 refresh 되는 security token 을 사용하게 된다.

그래서 IAM 을 사용하는 것은 이전에 access key 를 만들고, 그것을 넣어주는 작업을 좀 더 간편하게 해준다.


+-------------------------------------------+
| EC2 instance                              |
|    - iam/security-credentials/<role-name> |
|  +-------------+                          |
|  | Application |                          |
|  +-------------+                          |
+----------|---^----------------------------+
           |   |                          |
           |   |                          V
           |   |                       +---------+     +------------+
           |   |                       | Profile |---> | IAM role   |               
 role name |   |                       +---------+     | + policy   |
           |   |                                       | + policy   |
           |   |                                       +------------+
           V   |         
+------------------------------+
| Security Token Service(STS)  |
+------------------------------+

  • IAM role에 policy 를 만들어서 permission 을 명시하게 된다. resource-level 로 permission들을 적용할 수 있다.
  • IAM role 을 만들때 trusted entities 에 이 role을 사용할 수 있는 aws service 를 정의해주게 된다.
  • 이 IAM role을 ’instance의 profile’에 할당할 수 있다. 이 profile 은 1개의 IAM role 만 담을 수 있다.
    • 현재 run 하고 있는 instance 에도 attach 할 수 있다.
  • IAM console에서 IAM role 을 만들면, IAM console 은 instance profile 을 자동으로 생성한다.
  • 이 IAM role 에 policy 가 있다. 이 policy 에 어떤 action/resource 에 어떤 permission 이 허락되는지를 표시하게 된다.
  • instance 에 있는 application 은 STS 에다가 security credential 을 retrieve 한다.(아래 AssumeRole api 참고)
    • application 에서 사용하는 AWS SDK 에서 이 작업을 해주게 된다.
    • instance metadata item(iam/security-credentials/<role-name>) 을 보고 해당하는 security credential 을 retrieve 한다.
    • 이러한 security credentials은 임시적이며 자동으로 교체된다. 이전 credential이 만료되기 최소 5분 전에 새 credential을 사용할 수 있게 한다.

Retrieve instance metadata - Amazon Elastic Compute Cloud : aws는 http://169.254.169.254/latest/meta-data/ 에 각 instance 들의 meta-data들이 있다.

security credential 을 요청하는 command

아래는 s3access 라는 IAM role 에 대한 security credential 을 요청하는 command이다.

# s3access 라는 IAM role 에 대한 security credential 을 요청하는 command
#
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access


{
  "Code" : "Success",
  "LastUpdated" : "2012-04-26T16:39:16Z",
  "Type" : "AWS-HMAC",
  "AccessKeyId" : "ASIAIOSFODNN7EXAMPLE",
  "SecretAccessKey" : "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
  "Token" : "token",
  "Expiration" : "2017-05-17T15:09:54Z"
}

만약 instance 에서 AWS SDK를 사용해서 application 을 만들었다면, AWS SDK 가 자동으로 credential 들을 ec2 instance metadata service 로 부터 가져가서 사용하게 된다. (iam/security-credentials/<role-name>)

AssumeRole api

이 api 는 STS(security token service) 에서 제공한다.

이 api 를 호출하면 credential 을 return 해준다.

sts_client = boto3.client('sts')

assumed_role_object=sts_client.assume_role(
    RoleArn="arn:aws:iam::account-of-role-to-assume:role/name-of-role",
    RoleSessionName="AssumeRoleSession1"
)

credentials=assumed_role_object['Credentials']

s3_resource=boto3.resource(
    's3',
    aws_access_key_id=credentials['AccessKeyId'],
    aws_secret_access_key=credentials['SecretAccessKey'],
    aws_session_token=credentials['SessionToken'],
)

terraform code

terraform 으로 구성하면 아래와 같다.

설명:

  • ec2 가 사용할 수 있는 IAM role 을 만들고,
  • 그 role 에 s3 mycorp-myapp bucket 을 사용할 수 있는 권한을 준다.
  • 그리고 instance profile 을 이용해서 ec2 에 attach 한다.
// ----------------------------
//
// IAM Role
//
// ----------------------------

resource "aws_iam_role" "tf-myapp-s3" {
  name = "myapp-s3"
  assume_role_policy = jsonencode({
    Version = "2012-10-17",
    Statement = [
      {
        Sid    = "exmyapp"
        Action = "sts:AssumeRole",
        Effect = "Allow",
        Principal = {
          // entities that can use this role
          Service = "ec2.amazonaws.com"
        }
      }
    ]
  })
  tags = {
    Name = "my-app"
  }
}

resource "aws_iam_role_policy" "tf-myapp-s3" {
  name = "myapp-s3"
  role = aws_iam_role.tf-myapp-s3.name
  policy = jsonencode({
    Version = "2012-10-17",
    Statement = [
      {
        Action = "s3:ListBucket",
        Effect = "Allow",
        Resource = [
          "arn:aws:s3:::mycorp-myapp",
          "arn:aws:s3:::mycorp-myapp/*"
        ],
      },
      {
        Action = [
          "s3:DeleteBucket",
        ],
        Effect = "Deny",
        Resource = [
          "arn:aws:s3:::mycorp-myapp",
        ]
      }
    ]
  })
}


// ----------------------------
//
// instance profile
//
// ----------------------------
resource "aws_iam_instance_profile" "tf-myapp-s3" {
  name = "myapp-s3"

  role = aws_iam_role.tf-myapp-s3.name
}



// ----------------------------
//
// EC2
//
// ----------------------------
resource "aws_instance" "tf-myapp" {
  ...

  iam_instance_profile = aws_iam_instance_profile.tf-myapp-s3.name
  ...
}

Reference

[컴] AWS RDS 의 Multi-AZ

가격 / rds 가격 / multi az 가격

AWS RDS 의 Multi-AZ

2가지 종류가 있다. 1개의 standby DB instance 가 있는것과 2개의 standby DB instances 가 있는 경우.

1개가 있는 경우는 ‘Multi-AZ DB instance deployment’ 라 부르고 2개가 있는 경우 ’Multi-AZ DB cluster deployment’라고 부른다.

  1. Multi-AZ DB instance deployment : 1개의 standby DB instance
    • 동기화된 standby replica 를 다른 AZ(Availability Zone)에 갖고 있는다.
    • 동기화 될때 전송 비용은 무료[ref. 2]
  2. Multi-AZ DB cluster deployment : 2개의 read 가능한 standby DB instances
    • 같은 region
    • 3개의 Availability Zone에
    • 1 writer DB instance + 2 reader DB instances
    • 이것은 ‘PostgreSQL’와 ’MySQL’ 만 가능

가격(pricing)

multi-az 를 사용하면 1개의 standby 를 사용하는 것도 사용하지 않는 것보다 비싸다. 대략 2배가 된다.

On-Demand 가격

Reference

  1. Configuring and managing a Multi-AZ deployment - Amazon Relational Database Service
  2. Amazon RDS Multi AZ Deployments | Cloud Relational Database | Amazon Web Services

[컴] 데이터 정제하는 툴

데이터 정제 / refine / 값 변경 / 보안 / 가공 / data refine

데이터 정제하는 툴

원하는 데이터를 불러서 이것의 일부내용을 변경할 수 있다. 변경된 data 는 excel, sql, csv 등 여러 형태로 추출할 수 있다.

사용

이것은 local 에서 test 할 때 실데이터를 사용하는 것은 보안이슈가 있다. 그런 문제의 소지가 있는 값들(예를들어, 이름, 전화번호등)을 이상한 값으로 변경해서 저장후 테스트용 data 로 배포할 때 쓸 수 있을 듯 하다.