GASを使ってS3バケットからファイルを取り込んでみる

2024.12.17
GASを使ってS3バケットからファイルを取り込んでみる
この記事をシェアする

こんにちは、クラウドビルダーズのきむです。

本記事は、クラウドビルダーズ株式会社のアドベントカレンダー2024の17日目の記事となります!

業務の中でバッチ処理などで集計したデータをCSVファイルとしてS3に格納したものを、スプレッドシートに反映取り込みたいといったようなケースありました。

今回はGASを使用してS3バケットからCSVファイルの取得 + スプレッドシートへの反映方法をご紹介します。

GASからAWSリソースへアクセスするには?

AWS SDKはもちろんGASには対応しておらず、かといって自作でAPI通信を行う処理を作成するのはなかなか骨が折れます。

そんな悩みを一発で解決してrくれるのがaws-apps-scriptsです。

リポジトリにあるaws.jsをコピーしてGAS上に貼り付けるだけで簡単にAWSのAPIを呼び出すことが可能です。

作成者様に偉大な感謝を…

ソースコード

今回使用するソースコードは下記に置いています。

デモ用リソースの準備

リポジトリに格納しているdemo.shを使用して必要なリソースを作成します。

このスクリプトを実行して作成されるリソースは下記です。

リソースリソース名用途
IAMユーザーtest-gas-userGASで使用するIAMユーザー
IAMポリシーGasS3ReadPolicyデモ用S3バケットへの参照権限
アクセスキー & シークレットアクセスキーtest-gas-userの認証情報
GASで使用する
S3バケットgas-demo-bucket-‘$ACCOUNT_IDサンプルCSVの格納先
# 実行権限を付与
chmod +x demo.sh

# デモ用リソースの作成
./demo.sh create $ACCOUNT_ID

{
    "Location": "http://gas-demo-bucket-$ACCOUNT_ID.s3.amazonaws.com/"
}
upload: ./sample-data.csv to s3://gas-demo-bucket-$ACCOUNT_ID/sample-data.csv
{
    "User": {
        "Path": "/",
        "UserName": "test-gas-user",
        "UserId": "xxxxxxxxxx",
        "Arn": "arn:aws:iam::$ACCOUNT_ID:user/test-gas-user",
        "CreateDate": "2024-12-16T11:29:05+00:00"
    }
}
{
    "Policy": {
        "PolicyName": "GasS3ReadPolicy",
        "PolicyId": "xxxxxxxxxx",
        "Arn": "arn:aws:iam::$ACCOUNT_ID:policy/GasS3ReadPolicy",
        "Path": "/",
        "DefaultVersionId": "v1",
        "AttachmentCount": 0,
        "PermissionsBoundaryUsageCount": 0,
        "IsAttachable": true,
        "CreateDate": "2024-12-16T11:29:06+00:00",
        "UpdateDate": "2024-12-16T11:29:06+00:00"
    }
}
{
    "AccessKey": {
        "UserName": "test-gas-user",
        "AccessKeyId": "xxxxxxxxxx",
        "Status": "Active",
        "SecretAccessKey": "xxxxxxxxxx",
        "CreateDate": "2024-12-16T11:29:08+00:00"
    }
}

$ACCOUNT_IDには実行する環境のAWSアカウントIDを指定します。

リポジトリに格納しているsample-data.csvをS3バケットにアップロードするところまでスクリプトで実行されます。

sample-data.csvの中身は下記です。

集計月,商品コード,商品名,カテゴリ,在庫数,販売数,売上金額
2024-12,P001,エコノミーチェア,オフィス家具,125,45,1575000
2024-12,P002,ワイヤレスマウス,PC周辺機器,380,156,780000
2024-12,P003,デスクマット,文具・事務用品,250,89,445000
2024-12,P001,エコノミーチェア,オフィス家具,95,65,2275000
2024-12,P002,ワイヤレスマウス,PC周辺機器,424,198,990000
2024-12,P003,デスクマット,文具・事務用品,186,92,460000
2024-12,P001,エコノミーチェア,オフィス家具,180,78,2730000
2024-12,P002,ワイヤレスマウス,PC周辺機器,326,245,1225000
2024-12,P003,デスクマット,文具・事務用品,294,156,780000
2024-12,P001,エコノミーチェア,オフィス家具,152,95,3325000
2024-12,P002,ワイヤレスマウス,PC周辺機器,281,186,930000
2024-12,P003,デスクマット,文具・事務用品,238,124,620000 

生成されたアクセスキーとシークレットアクセスキーは後ほど使用するので控えておきます。

GASの実装

スクリプトの実装

App Scriptを開き、新規プロジェクトを作成します。プロジェクト名は任意のもので構いません。

リポジトリに格納されている.gsファイル分スクリプトを追加します。

最終的には下記の通りとなります。

プロパティの設定

スクリプトの追加が完了したら認証情報などを設定します。

左ペインからプロパティの追加を選択します。

スクリプトプロパティから必要なプロパティを追加します。先ほど控えた認証情報とAWSアカウントIDを設定しましょう。

スプレッドシートの作成

CSVファイルを反映させるスプレッドシートを作成します。

作成されたスプレッドシートのIDをconstants.SPREADSHEET_ID に設定します。

# xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx の部分が ID
https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/edit?gid=0#gid=0
const OPTIONS = {
  startRow: 1,
  startCol: 1,
  skipHeader: false,
  excludeColumns: [],
};

const REGION = 'ap-northeast-1';

const SPREADSHEET_ID = ''; // ここに値を設定

以上で準備は完了です。

GASの実行

下記は実行前のデータ未反映のスプレッドシートです。

App Scriptのコンソールからスクリプトを実行します。

正常に完了すると、シートが作成されデータが反映されているこを確認できました。

デモ用リソースの削除

動作確認が完了したらデモ用リソースを削除します。作成時と同じくdemo.shで削除可能です。

demo.shで作成されたリソースをすべて削除します。

# デモ用リソースの削除
./demo.sh delete $ACCOUNT_ID

さいごに

aws-apps-scriptsを利用することで簡単にS3バケットからファイルを取得することができました。

他のAWSリソースへのアクセスも可能なので、色々と応用が効きそうです。ぜひ活用してみてください。

この記事をシェアする
著者:きむ
フェスとポケカに夢中です