Amazon S3: ファイルアップロード

Amazon S3: ファイルアップロード

Amazon S3: Upload File

この工程は、Amazon S3 の指定フォルダにファイルをアップロードします。

Basic Configs
工程名
メモ
Auto Step icon
Configs for this Auto Step
conf_AccessKey
C1: アクセスキー *
conf_SecretKey
C2: シークレットアクセスキー *
conf_Region
C3: リージョンコード *
conf_Bucket
C4: バケット名 *
conf_Prefix
C5: オブジェクトキーのプレフィックス
conf_Files
C6: アップロードするファイルが保存されているデータ項目 *

Notes

  • アクセスキー、シークレットアクセスキーの作成方法については、Amazon Web Services のドキュメントを参照してください
  • [C5: オブジェクトキーのプレフィックス] やファイル名が「/」を含む場合、S3 は「/」の前の文字列をフォルダ名として解釈します
    • たとえば、[C5: オブジェクトキーのプレフィックス] に「folder1/」と入力すると、「folder1」という名前のフォルダにファイルがアップロードされます
    • 詳細は、Amazon Web Services のドキュメントを確認してください

Capture

See Also

Script (click to open)
  • 次のスクリプトが記述されている XML ファイルをダウンロードできます
    • aws-s3-file-upload.xml (C) Questetra, Inc. (MIT License)
    • Professional のワークフロー基盤では、ファイル内容を改変しオリジナルのアドオン自動工程として活用できます


const MAX_OBJECT_KEY_BYTES = 1024;
const MAX_FILE_SIZE = 5 * 1024 * 1024 * 1024; // 5GB(一度の PUT リクエストでアップロードできる上限)

function main() {
    ////// == 工程コンフィグ・ワークフローデータの参照 / Config & Data Retrieving ==
    const awsKey = configs.getObject("conf_AccessKey").getToken();
    const awsSecret = configs.getObject("conf_SecretKey").getToken();
    const region = retrieveRegion();
    const bucket = retrieveBucket();
    const prefix = retrievePrefix();
    const files = engine.findData(configs.getObject("conf_Files"));

    ////// == 演算 / Calculating ==
    if (files === null) { // ファイル添付なしの場合、何もせず正常終了
        return;
    }
    if (files.size() > httpClient.getRequestingLimit()) {
        throw new Error("The number of files exceeds the limit.");
    }
    for (let i = 0; i < files.size(); i++) {
        const file = files.get(i);
        uploadFile(awsKey, awsSecret, region, bucket, prefix, file);
    }
}

/**
 * config からリージョンコードを読み出す
 * リージョンコードの形式として不正な場合はエラー
 * @return {String}
 */
function retrieveRegion() {
    const region = configs.get("conf_Region");
    // 今後リージョンが増えることも考えて、中央の最大文字数には余裕をみている
    const reg = new RegExp("^[a-z]{2}-[a-z]{4,16}-[1-9]$");
    if (!reg.test(region)) {
        throw new Error("Region Code is invalid.");
    }
    return region;
}

/**
 * form-type="SELECT" editable="true"
 * の設定値を読み出す
 * @return {String}
 */
function getConfSelectValue(configName) {
    const def = configs.getObject(configName);
    if (def === null) {
        return configs.get(configName);
    }
    return engine.findData(def) ?? "";
}

/**
 * config からバケット名を読み出す
 * バケット名の形式として不正な場合はエラー
 * @return {String}
 */
function retrieveBucket() {
    const bucket = getConfSelectValue("conf_Bucket");
    if (bucket === "") {
        throw new Error("Bucket Name is blank.");
    }
    const reg = new RegExp("^[0-9a-z][0-9a-z-.]{1,61}[0-9a-z]$");
    if (!reg.test(bucket) || bucket.includes("..")) {
        throw new Error("Bucket Name is invalid.");
    }
    return bucket;
}

/**
 * config からオブジェクトキーのプレフィックスを読み出す
 * プレフィックスだけでオブジェクトキーのサイズ上限に達している場合、エラー
 * @return {String}
 */
function retrievePrefix() {
    const prefix = getConfSelectValue("conf_Prefix");
    if (encodeURIComponent(prefix).replace(/%../g,"x").length > MAX_OBJECT_KEY_BYTES - 1) {
        throw new Error(`The prefix is too long. Each object key must be less than ${MAX_OBJECT_KEY_BYTES} bytes including the prefix.`);
    }
    return prefix;
}

/**
 * ファイルアップロード
 * @param key アクセスキー
 * @param secret シークレットアクセスキー
 * @param region リージョン
 * @param bucket バケット
 * @param prefix プレフィックス
 * @param file ファイル
 */
function uploadFile(key, secret, region, bucket, prefix, file) {
    const objectKey = `${prefix}${file.getName()}`;
    const encodedObjectKey = encodeURIComponent(objectKey);
    if (encodedObjectKey.replace(/%../g,"x").length > MAX_OBJECT_KEY_BYTES) {
        throw new Error(`The object key "${objectKey}" is too long. Each object key must be less than ${MAX_OBJECT_KEY_BYTES} bytes.`);
    }
    if (file.getLength() > MAX_FILE_SIZE) {
        throw new Error(`The file "${file.getName()}" is too large. Each file must be less than ${MAX_FILE_SIZE} bytes.`);
    }
    const url = `https://${bucket}.s3.${region}.amazonaws.com/${encodedObjectKey}`;
    const response = httpClient.begin()
        .awsSignV4(key, secret, region, "s3")
        // オブジェクトロック設定のあるバケットにアップロードする場合、追加のチェックサムを指定する必要がある
        .header('x-amz-checksum-sha256', base64.encodeToString(digest.sha256(file)))
        .body(file)
        .put(url);
    const status = response.getStatusCode();
    if (status !== 200) {
        engine.log(response.getResponseAsString());
        throw new Error(`Failed to upload "${file.getName()}" to S3. status: ${status}`);
    }
}

    
上部へスクロール

Questetra Supportをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む