2022년 7월 22일 금요일

[AWS] LakeFormation Lambda IAM Role 권한설정

 

LakeFormation의

Administrative roles ans tasks 메뉴에서

사용하려는 Lambda role을 Data Lake Administators에 추가해야 한다.


예를 들어 user_AA라는 계정에서 lambda_BB 권한을 추가하려면

user_AA 의 IAM 에서 해당 정책을 추가 한다.


{

    "Version": "2012-10-17",

    "Statement": [

        {

            "Effect": "Allow",

            "Action": [

                "lakeformation:*",

                "cloudtrail:DescribeTrails",

                "cloudtrail:LookupEvents",

                "glue:GetDatabase",

                "glue:GetDatabases",

                "glue:CreateDatabase",

                "glue:UpdateDatabase",

                "glue:DeleteDatabase",

                "glue:GetConnections",

                "glue:SearchTables",

                "glue:GetTable",

                "glue:CreateTable",

                "glue:UpdateTable",

                "glue:DeleteTable",

                "glue:GetTableVersions",

                "glue:GetPartitions",

                "glue:GetTables",

                "glue:GetWorkflow",

                "glue:ListWorkflows",

                "glue:BatchGetWorkflows",

                "glue:DeleteWorkflow",

                "glue:GetWorkflowRuns",

                "glue:StartWorkflowRun",

                "glue:GetWorkflow",

                "s3:ListBucket",

                "s3:GetBucketLocation",

                "s3:ListAllMyBuckets",

                "s3:GetBucketAcl",

                "iam:ListUsers",

                "iam:ListRoles",

                "iam:GetRole",

                "iam:GetRolePolicy"

            ],

            "Resource": "*"

        },

        {

            "Effect": "Allow",

            "Action": [

                "lakeformation:PutDataLakeSettings",

                "lakeformation:GetDataLakeSettings"

            ],

            "Resource": "*"

        }

    ]

}

2022년 7월 17일 일요일

[Architecture] 최신 데이터 인프라 관련 동영상

 

최신 데이터 인프라 정보를 7개의 동영상으로 설명하는 유튜브 동영상

원천소스를 Extract하는 것부터 Transform을 배치 or 실시간 하는 소프트웨어,

DataWarehous, DataLake를 최근 어떻게 구성하는지 설명하고 있다.


국내에서는 자주 사용되는 것 (Airflow, Kafka, Spark )

이외에 이런것도 있다는 것을 알 수 있어 DA설계지 여러 선택폭을 고려할 수 있는

안목을 넓히는데 도움이 되지 않을까 싶다.

https://www.youtube.com/watch?v=g_c742vW8dQ&list=PLL-_zEJctPoJ92HmbGxFv1Pv_ugsggGD2&index=1






[AWS] Athena쿼리 가이드

Athena

FaceBook에서 개발한 오픈소스 인메모리 분산쿼리엔진 Presto를 사용


파티셔닝
- WHERE절 사용시 파티셔닝된 컬럼사용을 우선시하여 쿼리비용 감소
- 파티션 수가 너무 많으면 파티션 메타데이터를 처리하는데 오버헤드가 증가해, 비용과 쿼리속도 저하 (테이블당 최대 10만개 파티션)
- 파티션 수가 너무 적을 시, 참조하는 파티션이 중복되면 파티션의 이점을 살리지 못함
- 데이터가 없는 파티션은, 제거하여 관리


파일 압축과 크기
- 파일압축으로 데이터가 작을 수록 쿼리속도와 S3에서 Athena까지 네트워크 트랙픽 감소
- Parquet, ORC 파일 사용 권장
- 파일사이즈가 작을 경우(128MB 이하), 읽기과정에서 생기는 오버헤드가 많이 일어나고
  파일사이즈가 클경우, 한파일을 다 읽을 때까지 대기해 아테나 병렬기능을 활용하지 못함


ORDER BY 최적화
- Athena Presto엔진은 모든 데이터행을 전송한 다음 정렬을 실행
- 정렬된 위, 아래의 N개 값을 활용하는 경우 LIMIT절 사용하여 비용 및 쿼리 실행 시간 절감


JOINS 최적화
- Athena의 Presto엔진은 왼쪽에서 오른쪽으로 조인을 수행
- 왼쪽에 데이터가 큰 테이블을 지정하고 오른쪽에 작은테이블 지정해야 사용메모리가 적어지고 조회가 빨라짐


GROUP BY 최적화
- group by 쿼리에서 높은 카디널리티를 가지는 순으로 칼럼을 정렬하여 사용
* 카디널리티(Cardinality) : 고유 값이 균등하게 분산된 정도


윈도 함수
- 윈도 함수는 메모리를 많이 사용하므로 PARTITION BY절과 함께 사용을 권장
- 윈도 함수 대신 같은 기능의 다른 쿼리 사용 권장


LIKE
- 문자열에 LIKE '%string%' 보다는 regexp_like() 함수 및 정규표현식 사용하여 비용절감
- '%string%' 보다 '%string' 사용시 스캔데이터 감소


필요한 컬럼만 사용
- Asterisk (*) 사용 지양
- Column의 수를 줄이면 전체 쿼리 실행 파이프 라인을 통해 처리하는 데이터양이 줄어듬


참조 :
https://docs.aws.amazon.com/ko_kr/athena/latest/ug/performance-tuning.html
https://aws.amazon.com/ko/blogs/korea/top-10-performance-tuning-tips-for-amazon-athena/
https://www.upsolver.com/blog/aws-athena-performance-best-practices-performance-tuning-tips
https://jaemunbro.medium.com/aws-athena-presto-query-guide-886ce047d710

2022년 4월 19일 화요일

[ Lambda ] 다른 AWS계정의 S3로 람다 trigger 설정


 

[ 테스트 ]

AAAA계정의 S3에서 파일이 업로드되면

BBBB계정의 Lambda 실행



[ BBBB 계정 ]

1. Lambda 함수가 있는 AWS 계정을 사용하여 Lambda 콘솔에서 함수 페이지를 엽니다.

2. Amazon S3에서 호출할 Lambda 함수의 이름을 선택합니다.

3. 구성 탭에서 권한을 선택합니다.

4. 리소스 기반 정책 창에서 권한 추가를 선택합니다.


5. 정책 문 창에서 AWS 서비스를 선택합니다. 서비스 드롭다운 목록이 나타납니다.

6. 서비스 드롭다운 목록에서 S3를 선택합니다. 더 많은 텍스트 필드가 나타납니다.

7. 소스 계정의 경우 Amazon S3 버킷을 호스팅하는 계정의 AWS 계정 ID를 입력합니다.

8. 소스 ARN에 Amazon S3 버킷의 ARN을 입력합니다. 다음 형식을 사용합니다.

arn:aws:s3:::bucket_name

중요: bucket_name을 Amazon S3 버킷의 이름으로 바꿉니다.




[ AAAA계정 ]

1. AWS Management Console에 로그인한 후 Amazon S3 콘솔을 엽니다.

2. 버킷(Buckets) 목록에서 이벤트를 사용 설정하려는 버킷의 이름을 선택합니다.

3. [속성(Properties)]을 선택합니다.

4. 이벤트 알림(Event Notifications) 섹션으로 이동하여 이벤트 알림 생성(Create event notification)을 선택합니다.

5. 일반 구성(General configuration) 섹션에서 이벤트 알림을 설명하는 이벤트 이름을 지정합니다. 선택적으로 접두사와 접미사를 지정하여 지정된 문자로 끝나는 키가 있는 객체로 알림을 제한할 수도 있습니다.

  • 이벤트 이름(Event name)에 대한 설명을 입력합니다. 이름을 입력하지 않으면 전역 고유 식별자(GUID)가 생성되어 이름에 사용됩니다.
  • (선택 사항) 접두사를 기준으로 이벤트 알림을 필터링하려면 접두사(Prefix)를 입력합니다. 예를 들어 특정 폴더에 파일이 추가될 때만 알림을 받도록 접두사 필터를 설정할 수 있습니다(예: images/).
  • (선택 사항) 접미사를 기준으로 이벤트 알림을 필터링하려면 접미사(Suffix)를 입력합니다.

6. 이벤트 유형(Event types) 섹션에서 알림을 받을 이벤트 유형을 하나 이상 선택합니다.


다양한 이벤트 유형 목록은 SQS, SNS 및 Lambda에 지원되는 이벤트 유형 섹션을 참조하세요. 

https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/notification-how-to-event-types-and-destinations.html#supported-notification-event-types )

7. 대상(Destination) 섹션에서 이벤트 알림 대상을 선택합니다.



[ 참조 ]

https://aws.amazon.com/ko/premiumsupport/knowledge-center/lambda-s3-cross-account-function-invoke/

https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/enable-event-notifications.html


2022년 4월 12일 화요일

[ AWS ] Athena query 처리량 증가 ( Service Quotas )

 

AWS Athena 사용시, 여러 계정에서 query를 실행할 때

처리량의 한계에 의해 athena rate exceeded 에러가 나타난다.


aws servicequotas를 통해 DDL, DML의 처리량 증가 요청을 한다.

Athena 외에도 DynamoDB, Lambda와 같은 서비스의 할당량을 조정할 수 있다.



servicequotas 콘솔 :

https://ap-northeast-2.console.aws.amazon.com/servicequotas/home/


참조 Doc :

https://docs.aws.amazon.com/ko_kr/general/latest/gr/aws_service_limits.html

2022년 4월 7일 목요일

[ Laravel ] Centos에서 Laravel 설치

 

Centos에서 Laravel 설치


[ APM설치 ]

yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum -y install epel-release yum-utils
yum-config-manager --enable remi-php74
yum install httpd
yum install php php-cli php-bcmath php-bz2 php-common php-curl php-dba php-gd php-json php-mbstring php-opcache php-readline php-soap php-xml php-xmlrpc php-zip php-ctype php-pdo php-redis php-mysql php-imagick php-intl

vi /etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

yum install MariaDB-server MariaDB-client
systemctl enable httpd
systemctl enable mariadb


[ Apache /etc/httpd/conf/http.conf 설정 ] (빨간색 추가 및 변경)

LoadModule rewrite_module modules/mod_rewrite.so

<Directory "/home/centos">
    AllowOverride None
    # Allow open access:
    Require all granted
</Directory>

<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>

# Virtual hosts
Include conf/extra/httpd-vhosts.conf


[ /etc/httpd/conf/extra/httpd-vhosts.conf 설정 ]

<VirtualHost *:80>
    ServerAdmin mygmail@gmail.com
    DocumentRoot "/home/centos/laravel_project/public"
    ServerName 11.22.333.44
    #ServerAlias 11.22.333.44
    ErrorLog "/home/centos/laravel_project/logs/error_log"
    CustomLog "/home/centos/laravel_project/logs/access_log" common
        <Directory /home/centos/laravel_project/public/>
                AllowOverride All
                Allow from all
        </Directory>
        <Directory /home/centos/laravel_project/storage/>
                AllowOverride All
                Allow from all
        </Directory>
</VirtualHost>


[ 라라벨 설치 ]

timedatectl set-timezone Asia/Seoul
# 라라벨을 인스톨을 제공하는 composer설치
curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/bin/
ln -s /usr/bin/composer.phar /usr/bin/composer

# 라라벨 설치
composer global require laravel/installer
echo 'export PATH="$PATH:$HOME/.config/composer/vendor/bin"' >> ~/.bashrc
source .bashrc

# 새 프로젝트 생성
laravel new laravel_project


[ 폴더 권한 변경 ]

1. 라라벨 폴더 경로가 /home/centos/laravel_project 라면 3개폴더 모두 chmod 755
2. chmod -R 777 laravel_project/storage (정확히 framework, logs 폴더때문)


[ 실행 ]

systemctl restart httpd
web url창에 11.22.333.44로 접속


[ 실행 화면 ]






2022년 4월 4일 월요일

[ Python ] AWS boto3를 이용한 S3 Path Wild Card


s3의 list_objects를 이용해 prefix를 사용할 수 있지만, 

prefix안에 wild card를 활용할 순 없다.


s3경로가 s3://my-bucket/country/city/town/20220404/myfile.parquet 일 때

  • Prefix='country/city/town/20220404 ( 0 )
  • Prefix='country/*/*/20220404 ( X ) 


pip install awswrangler 

모듈 설치 후 와일드카드를 사용한 S3경로로 필터링 가능


[ Sample Code ]

import boto3
import awswrangler

BUCKET = 'my-bucket' 
S3_PATH = 'country/*/*/20220404/*

s3_paths = awswrangler.s3.list_objects(f's3://{BUCKET}/{S3_PATH}')
for path in s3_paths:
    print(path)