エンジニアリングTips

【GAS×AWS】S3格納ファイルをGASから操作する方法

はじめに

AWS S3上に保存されているテキストファイルや画像といったオブジェクトを、GASから取得/更新する方法を解説します。
GASの構成としては以下の通りとなります。

では早速作ってみましょう!

S3-for-Google-Apps-Script

GASからAWS S3を使用する際、認証まわりのプログラムを書く必要がありますがかなり大変で時間がかかります。
そこで何か使えるモジュールがないか探したところありました!

S3-for-Google-Apps-Script - GitHub

上記Githubから以下2ファイルそのままをGASのプロジェクトに持ってきます。

  • S3.gs
  • S3Request.gs

持ってきた後、上記ファイルに少し修正を加える必要があります。
※テキストファイルのみ操作したい場合は、以下の行程は不要です。

修正箇所

1.S3Request.gsの12行目S3Request関数内のregion名を「ap-northeast-1」に設定します。
※ハンズオンでは一旦「ap-northeast-1」で進めます。違うリージョンにしたい方は後述含め置き換えて読み進めてください。

function S3Request(service) {
  this.service = service;

  this.httpMethod = "GET";
  this.contentType = "";
  this.content = ""; //content of the HTTP request
  this.bucket = ""; //gets turned into host (bucketName.s3.amazonaws.com)
  this.objectName = "";
  this.headers = {};

  this.date = new Date();
  this.serviceName = 's3';
  this.region = 'ap-northeast-1';
  this.expiresHeader = 'presigned-expires';
  this.extQueryString = '';
}

2.S3Request.gsの34行目setContentType関数の1行をコメントアウトします。

S3Request.prototype.setContentType = function (contentType) {
  // if (typeof contentType != 'string') throw 'contentType must be passed as a string';
  this.contentType = contentType;
  return this;
};

3.S3Request.gsの391行目hexEncodedHash関数の内容を以下の通り修正します。

S3Request.prototype.hexEncodedHash = function(string) {
  if(typeof string === "string")
    return this.hex(Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, string, Utilities.Charset.UTF_8));
  else
    return this.hex(Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, string.getBytes()));
}

次はS3バケットを作っていきましょう!

S3バケット作成

AWSコンソールに入ってS3サービスを選択し、「バケットを作成」ボタンを押下

任意のバケット名の入力とAWSリージョンを「ap-northeast-1」で選択し、画面一番下の「バケットを作成」ボタンを押下
この時、バケット名とAWSリージョンをメモしてください。
※この演習ではバケット名以外の設定値をデフォルトにしてます。プロジェクト毎に適宜値を設定してください。

以下の通り、バケットが作成されたらOKです

また、バケットの中に「テスト」だけ書かれたファイル(test.txt)をアップロードしておきましょう!

次はS3バケットを操作するIAMユーザーを作っていきましょう!

IAMユーザー作成

AWSコンソールに入ってIAMサービスを選択し、「ユーザーを追加」ボタンを押下

任意のユーザー名を入力し、画面下の「次へ」ボタンを押下

ユーザーのポリシーを「AmazonS3FullAccess」で以下の通り選択し、そのままユーザーを作成完了

作成したユーザーの「セキュリティ認証情報」タブに遷移し、「アクセスキーを作成」を押下

「AWSの外部で実行されるアプリケーション」を選択し、次へ進む

作成されたアクセスキーとシークレットキーをコピーしておく。

これで前準備は整いました!
では実際にS3のオブジェクト操作に入っていきたいと思います。

S3オブジェクト操作

GASのプロジェクトにスクリプトを新規作成し、以下実行したいコードを貼り付けてください。
以下コードはテキストファイルの操作についてとなります。

オブジェクト取得

// ++++++++++++++++++++++++++++++
// オブジェクトを取得する
// ++++++++++++++++++++++++++++++
function getObjectFromS3() {
  // init S3 instance
  const s3 = getInstance('<アクセスキー>', '<シークレットキー>');
  // get the object from S3 bucket
  const object = s3.getObject('<バケット名>', 'test.txt');
  console.log(object.getDataAsString());
}

test.txtの内容が取得できました!

オブジェクトアップロード

// ++++++++++++++++++++++++++++++
// オブジェクトをアップロードする
// ++++++++++++++++++++++++++++++
function uploadObjectToS3() {
  // init S3 instance
  const s3 = getInstance('<アクセスキー>', '<シークレットキー>');
  // upload the object to S3 bucket
  s3.putObject('<バケット名>', 'upload.txt', 'アップロードテスト');
}

upload.txtがアップロードされました!

オブジェクト削除

// ++++++++++++++++++++++++++++++
// オブジェクトを削除する
// ++++++++++++++++++++++++++++++
function deleteObjectInS3() {
  // init S3 instance
  const s3 = getInstance('<アクセスキー>', '<シークレットキー>');
  // delete the object In S3 bucket
  s3.deleteObject('<バケット名>', 'upload.txt');
}

upload.txtが削除されました!

まとめ

いかがだったでしょうか?
GASからAWS S3のオブジェクトを操作するやり方に悩んでいる方への助けとなればと思います!

-エンジニアリングTips
-, ,