2017-11-08

AWS CodeBuildのArtifactsにServer Side Encryptionがつく

タイトルのとおりなのだが、この挙動を無効にすることは現状できない。

https://forums.aws.amazon.com/thread.jspa?threadID=256656

上のスレッドでAWSのスタッフがコメントしているが、あくまでも顧客からのリクエストとして受け取ると言ったきりだ。大抵こういうリクエストは数年放置される。AWSにかぎらずAzureのリクエストだって同じようなもので、たくさんのUpvoteを得ている投稿には「X年たったけどなんか進捗ある?」みたいな書き込みが連なっている。ステータスがアンダーレビューになってからが長いのだ。

ワークアラウンドとして、私はS3へartifactsがアップロードされたことをトリガーにしてオブジェクトをコピーし、SSE付きのファイルを削除するLambdaを使うことにした。APIでSSEを解除することもできないため、やや非効率であることは理解しておきたい。

const aws = require('aws-sdk');
const s3 = new aws.S3({apiVersion: '2006-03-01'});

exports.handler = (event, context, callback) => {
    const copyObjectParams = {
        Bucket: 'BUCKET_NAME',
        CopySource: `/BUCKET_NAME/${event.Records[0].s3.object.key}`,
        Key: event.Records[0].s3.object.key.replace(/artifacts/g, 'no_sse'),
        ACL: 'public-read'
    };

    const deleteObjectParams = {
        Bucket: 'BUCKET_NAME',
        Key: event.Records[0].s3.object.key
    }

    s3.copyObject(copyObjectParams).promise()
    .then(result => s3.deleteObject(deleteObjectParams).promise())
    .then(result => callback(null, {success: true}))
    .catch(err => {
        console.log(copyObjectParams, deleteObjectParams, err);
        callback({success: false});
    })
};