[AWS] S3: Inventory
S3๋ ํธํ๊ธฐ๋ ํ์ง๋ง ์ฌ์ฉ๋์ด ๋๊ฒ ๋๋ฉด ์๋นํ ๊ณจ์นซ๊ฑฐ๋ฆฌ๊ฐ ๋๋ค.
์ฌ์ฉ ํจํด์ ํ์ธํ๊ณ ๋น์ฉ์ ์ต์ ํํ๋ ๊ฒ์ด ์๋นํ ๊น๋ค๋กญ๊ธฐ ๋๋ฌธ์ด๋ค. ๋๋์ฒด ๋ฌด์จ ํ์ผ๋ค์ด ์ฉ๋์ ๋จน๊ณ ์๋์ง, ์ง์๋ ๋๋๊ฑด์ง ํ์ธํ๊ธฐ๊ฐ ์ฐธ ๋๊ฐํ๋ค.
S3 Inventory๋ ๊ทธ๋ฐ ์ํฉ์์ ํ์ผ ๋ชฉ๋ก์ ์ถ์ ํ๊ธฐ ์ํ ์๋จ์ด๋ค. ์ด๋ค ํ์ผ๋ค์ด ์ด๋ค ๊ฒฝ๋ก๋ก ์๋์ง, ํฌ๊ธฐ๋ ์ผ๋ง๋ ๋๋์ง ๋ฑ์ ์๋์ผ๋ก ๋ฝ์์ ๋ค๋ฅธ S3 ๋ฒํท์ ๋ณด๊ณ ์๋ก ์ ๋ฆฌํด์ฃผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
LIST API ์จ์ ์ง์ ๋ฐ์์๋ ๋๊ธด ํ๋๋ฐ, ๋๋ฌด ์ค๋๊ฑธ๋ฆฌ๊ณ , ๋น์ฉ๋ ๋น์ฉ๋๋ก ๋ค๊ณ , ๋ถํธํ๋ค.
๋น์ฉ
์ด๊ฒ๋ ๊ณต์ง๋ ์๋๋ค.
S3์ ์ ์ฅํ๋ ๋น์ฉ๋ ๋น์ฉ์ด๊ณ , ๊ฐ์๋น ๋น์ฉ์ ๋ ๋ฐ๋๋ค.
https://aws.amazon.com/ko/s3/pricing/?nc=sn&loc=4
S3 ๋ฒํท ์งํ์ ๊ฐ๋ณด๋ฉด ๊ฐ์๊ฐ ๋จ๋๊น ๊ทธ๊ฑธ๋ก ๋น์ฉ์ ์ถ์ฐํด๋ณผ ์ ์๋ค.
์ด ๊ฒฝ์ฐ์๋ 22.3 X 0.0028์ด๋๊น 0.06๋ฌ๋ฌ์ธ ์
์ด๋ค. ๋ง ์์ฒญ ๋น์ธ์ง๋ ์๋ค.
Inventory ์ธํ ํ๊ธฐ
๋จผ์ ์ ์ฅํ ๋ฒํท์ ๋ง๋ จํ๋ค.
๊ธฐ์กด ๋ฒํท์ ํ์ ๋๋ ํฐ๋ฆฌ๋ก ์ ์ฅํด๋ ๋๊ธด ํ๋๋ฐ, ๋ณ๋๋ก ํ๋๊ฑธ ๊ถํ๋ค.

๊ทธ๋ฆฌ๊ณ S3์ ๊ด๋ฆฌ ํญ์ผ๋ก ๋ค์ด๊ฐ๋ฉด ์ธ๋ฒคํ ๋ฆฌ ๊ตฌ์ฑ ํ๋ฉด์ผ๋ก ๋ค์ด๊ฐ ์ ์๋ค.

์ ์ฅ๋ ๋ฒํท ๊ฒฝ๋ก ์ง์ ํ๊ณ
์ด๋ค ํ์์ผ๋ก ์ ์ฅ๋ ์ง๋ฅผ ์ ํํ ์ ์๋ค.
์ง์ง ์์ฒญ ๋ง์์ ๋น์ฉ์ด๋ ์ฝ๊ธฐ ์ฑ๋ฅ์ด ๋ถ๋ด๋ ๊ฒ ๊ฐ๋ค๋ฉด Parquet์ผ๋ก ๋ฝ์ผ๋ฉด ๋๊ณ , ๋์ถฉ ํธํ๊ฒ ๋ณด๊ณ ์ถ์ผ๋ฉด CSV๋ก ๋ฝ์ผ๋ฉด ๋๋ค.
์ถ๊ฐ ํ๋๋ ์ ํํ ์ ์๋ค.
์ด ์ ๋๋ง ๋ฃ์ด๋ ์ถฉ๋ถํ์ง ์ถ๋ค.
๊ทธ๋ ๊ฒ ๋ง๋ค๊ณ ๋๋ฉด... ์๋ฌด๋ฐ ์ผ๋ ์๋ค.
์ค์๊ฐ ์๋น์ค๊ฐ ์๋๋ผ์ ๋ฐ๋ก ๋ญ๊ฐ ์๊ธฐ์ง ์๊ณ , ์ต๋ 48์๊ฐ ์ด๋ด์ ๋ชจ์์ ๋์ ธ์ค ๊ฒ์ด๋ค.
๊ทผ๋ฐ ๋ง์ด 48์๊ฐ์ด์ง, ๋ณดํต ๋ช์๊ฐ ์ด๋ด๋ก ์ฃผ๊ธด ํ๋๋ผ.

์ด๋ ๊ฒ ๋ง์ด๋ค.
๊ทธ๋ผ ์ ๊ฑธ ๋ค์ด๋ฐ๋ , athena๋ฅผ ์ฐ๋ ํด์ ์ฝ์ผ๋ฉด ๋๋ค.
๊ฐ์ฅ ๊ฐ๋จํ๊ฑด ๊ทธ๋ฅ athena ๋ถ์ฌ์ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ๋ก ๋ ๋ฆฌ๋ ๊ฒ์ด๋ค.
CREATE EXTERNAL TABLE s3_inventory (
bucket STRING,
key STRING,
size BIGINT,
last_modified_date STRING,
storage_class STRING
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION 's3://<dest-bucket>/<dest-prefix>/<src-bucket>/<config-id>/data/'
TBLPROPERTIES ('skip.header.line.count'='0');

๊ทธ๋ผ ์ด๋ฐ ์์ผ๋ก ์ ๋ฝํ๋์ฌ ๊ฒ์ด๋ค.
SELECT
split_part(key, '/', 1) AS top_dir,
COUNT(*) AS object_count,
SUM(CAST(size AS BIGINT)) AS total_bytes,
ROUND(AVG(CAST(size AS BIGINT)), 0) AS avg_bytes,
MIN(CAST(size AS BIGINT)) AS min_bytes,
MAX(CAST(size AS BIGINT)) AS max_bytes,
-- ์ฌ๋์ด ๋ณด๊ธฐ ์ข์ ๋จ์(GB/MB)
ROUND(SUM(CAST(size AS BIGINT)) / 1024.0/1024/1024, 2) AS total_gb,
ROUND(AVG(CAST(size AS BIGINT)) / 1024.0/1024, 2) AS avg_mb,
ROUND(MAX(CAST(size AS BIGINT)) / 1024.0/1024, 2) AS max_mb
FROM s3_inventory
GROUP BY split_part(key, '/', 1)
ORDER BY total_bytes DESC;
์ต์์ prefix ๊ธฐ์ค์ผ๋ก ์ง๊ณํ๋ ๋จ์ํ ์ฟผ๋ฆฌ๋ค. ์ด๋ ๊ฒ ์ซ์๊ฐ๋ฉด ๋๋ค.
์ฐธ์กฐ
https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/storage-inventory.html
https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/configure-inventory.html
https://dev.classmethod.jp/articles/extract_object_metadata_from_s3_bucket_using_s3_inventory/