簡體   English   中英

AWS - 使用 CloudFormation 將數據從一個 S3 存儲桶移動到另一個存儲桶

[英]AWS - Moving data from one S3 bucket to another with CloudFormation

我正在嘗試使用 CloudFormation 創建一個堆棧。 堆棧需要從中央 S3 存儲桶中獲取一些數據文件並將它們復制到它自己的“本地”存儲桶。

我已經編寫了一個 lambda 函數來執行此操作,當我在帶有測試事件的 Lambda 控制台中運行它時它可以工作(測試事件使用真正的中央存儲庫並成功地將文件復制到指定的存儲庫)。

我當前的 CloudFormation 腳本執行以下操作:

  1. 創建“本地”S3 存儲桶
  2. 創建 Lambda 函數可用於訪問存儲桶的角色
  3. 定義 Lambda 函數以將指定文件移動到“本地”存儲桶
  4. 定義一些自定義資源來調用 Lambda 函數。

它在第 4 步開始出錯 - Cloudformation 執行似乎在這里凍結( CREATE_IN_PROGESS )。 此外,當我嘗試刪除堆棧時,它似乎只是卡在DELETE_IN_PROGRESS

下面是我在 CloudFormation 腳本中調用 Lambda 函數的方法:

"DataSync": {
    "Type": "Custom::S3DataSync",
    "Properties": {
        "ServiceToken": { "Fn::GetAtt" : [ "S3DataSync", "Arn" ] },
        "InputFile": "data/provided-as-ip-v6.json",
        "OutputFile": "data/data.json"
    }
},
"KeySync1": {
    "Type": "Custom::S3DataSync",
    "Properties": {
        "ServiceToken": { "Fn::GetAtt" : [ "S3DataSync", "Arn" ] },
        "InputFile": "keys/1/public_key.pem"
    }
},
"KeySync2": {
    "Type": "Custom::S3DataSync",
    "Properties": {
        "ServiceToken": { "Fn::GetAtt" : [ "S3DataSync", "Arn" ] },
        "InputFile": "keys/2/public_key.pem"
    }
}

Lambda 函數本身:

exports.handler = function(event, context) {
    var buckets = {};
    buckets.in = {
        "Bucket":"central-data-repository",
        "Key":"sandbox" + "/" + event.ResourceProperties.InputFile
    };   
    buckets.out = {       
        "Bucket":"sandbox-data",       
        "Key":event.ResourceProperties.OutputFile || event.ResourceProperties.InputFile   
    };   

    var AWS = require('aws-sdk');   
    var S3 = new AWS.S3();   

    S3.getObject(buckets.in, function(err, data) {       
        if (err) {           
            console.log("Couldn't get file " + buckets.in.Key);           
            context.fail("Error getting file: " + err)       
        }       
        else {           
            buckets.out.Body = data.Body;           
            S3.putObject(buckets.out, function(err, data) {               
                if (err) {                   
                    console.log("Couln't write to S3 bucket " + buckets.out.Bucket);                   
                    context.fail("Error writing file: " + err);               
                }               
                else {                   
                    console.log("Successfully copied " + buckets.in.Key + " to " + buckets.out.Bucket + " at " + buckets.out.Key);                   
                    context.succeed();               
                }           
            });       
        }   
    });
}

您的自定義資源功能需要將信號發送回CloudFormation以指示完成,狀態和任何返回的值。 您將看到CREATE_IN_PROGRESS作為CloudFormation中的狀態,直到您通知它您的功能已完成。

信令CloudFormation的通用方式是發布對預先簽名的S3 URL的響應。 但是有一個cfn-response模塊可以使Lambda函數更容易實現。 有趣的是,為Lambda支持的自定義資源提供的兩個示例使用不同的方法:

是的,我做了同樣的事情。 我們需要上傳(PUT 請求)我們請求的狀態。(需要發送狀態為 SUCCESS)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM