전체 S3 버킷을 다운로드 하시겠습니까?


705

AWS Management Console에서 전체 S3 버킷을 다운로드하는 옵션이없는 것 같습니다.

내 버킷 중 하나에서 모든 것을 잡는 쉬운 방법이 있습니까? 루트 폴더를 공개 wget하고 모든 것을 잡은 다음 다시 비공개로 만드는 것에 대해 생각하고 있었지만 더 쉬운 방법이 있는지 모르겠습니다.


4
여기에 많은 사람들이 말했듯 aws s3 sync이 최고입니다. 그러나 아무도 강력한 옵션을 지적하지 않았습니다 dryrun. 이 옵션을 사용하면를 사용할 때 s3에서 / s3으로 다운로드 / 업로드되는 내용을 볼 수 있습니다 sync. 로컬 또는 s3 버킷의 내용을 덮어 쓰고 싶지 않을 때 매우 유용합니다. 이것이 사용되는 방식입니다 aws s3 sync <source> <destination> --dryrun. 원하지 않는 변경 사항을 업로드하지 않기 위해 새 콘텐츠를 버킷에 푸시하기 전에 항상 사용했습니다.
Perimosh

답변:


1334

AWS CLI

자세한 내용은 " AWS CLI 명령 참조 "를 참조하십시오.

AWS는 최근 boto와 매우 유사하게 작동하는 명령 줄 도구를 출시했습니다.

sudo easy_install awscli

또는

sudo pip install awscli

설치 한 후에는 다음을 간단히 실행할 수 있습니다.

aws s3 sync s3://<source_bucket> <local_destination>

예를 들면 다음과 같습니다.

aws s3 sync s3://mybucket .

모든 객체를 mybucket현재 디렉토리로 다운로드합니다 .

그리고 출력합니다 :

download: s3://mybucket/test.txt to test.txt
download: s3://mybucket/test2.txt to test2.txt

단방향 동기화를 사용하여 모든 파일을 다운로드합니다. 그것은 것입니다 하지 당신은 지정하지 않으면 현재 디렉토리에있는 기존 파일을 삭제 , 그것은 S3에 파일을 변경하거나 삭제하지 않습니다. --delete

S3 버킷에서 S3 버킷으로 또는 로컬에서 S3 버킷으로 동기화를 수행 할 수도 있습니다.

설명서 및 기타 예를 확인하십시오 .

위의 예는 전체 버킷을 다운로드하는 방법이지만, 수행하여 폴더를 재귀 적으로 다운로드 할 수도 있습니다

aws s3 cp s3://BUCKETNAME/PATH/TO/FOLDER LocalFolderName --recursive

그러면 버킷 PATH/TO/FOLDER내의 디렉토리 내에서 모든 파일과 폴더 키를 재귀 적으로 다운로드하도록 CLI에 지시합니다 BUCKETNAME.


223
먼저 실행 aws configure하고 추가 access key하고 secret access key찾을 수있는 이곳 .
Erwin Rooijakkers

12
Windows 설치 프로그램 aws.amazon.com/cli로 이동하십시오 . 환경 변수 "AWS_ACCESS_KEY_ID"에서 액세스 키 ID와 "AWS_SECRET_ACCESS_KEY"에서 비밀 키를 가져옵니다.
매트 본드

7
나는 해봤 s3cmd하고 Cyberduck,하지만 나를 위해 awscli나의 버킷에서 다운로드 ~ 70.000 파일까지 가장 빠른 방법으로했다.
Arjen

11
다운로드에만 관한 질문이 있지만이 명령은 디렉토리와 S3간에 양방향 동기화를 수행한다고 생각합니다. 아무것도 업로드하지 않으려면 현재 디렉토리가 비어 있는지 확인하십시오.
Jesse Crossen

15
@JesseCrossen이 aws s3 sync명령은 아무 것도 업로드하지 않지만 S3에없는 파일은 로컬로 삭제합니다. 설명서를 참조하십시오 .
Flimm

168

s3cmd버킷을 다운로드 하는 데 사용할 수 있습니다 .

s3cmd --configure
s3cmd sync s3://bucketnamehere/folder /destination/folder

라는 다른 도구를 사용할 수 있습니다 rclone. 다음은 Rclone 설명서의 코드 샘플입니다.

rclone sync /home/local/directory remote:bucket

5
이것은 매우 느립니다. 특히 점진적으로 사용하려는 경우. 대역폭을 포화시킬 수있는 멀티 스레드 솔루션이 있습니까?
피터 라다

이 아래의 솔루션은 더 많은 플랫폼에 더 많은 표준 및 개방
ABC123

이는 요청자 지불 버킷에 대해서는 작동하지 않습니다 ( arxiv.org/help/bulk_data_s3 참조 ) :-(
Martin Thoma

다운로드를 위해 패턴 일치를 수행해야하는 경우 어떻게 솔루션을 사용할 수 있습니까? 내 질문 : stackoverflow.com/questions/25086722/…
Shrikant Kakani

84

Amazon S3 데이터를 로컬 시스템에 복사하는 데 몇 가지 방법을 사용했으며 s3cmd, 가장 쉬운 방법은 Cyberduck 입니다.

Amazon 자격 증명을 입력하고 간단한 인터페이스를 사용하여 버킷, 폴더 또는 파일을 다운로드, 업로드, 동기화하기 만하면됩니다.

스크린 샷


잘 작동합니다! Windows 및 Mac (GPL)에서 사용 가능합니다.
craastad

s3cmd 자격 증명을 요구하는 것 - Cyberduck은 쉽게 익명으로 공개 파일을 다운로드 할 수 있습니다
chrishiestand

전송에서도 잘 작동합니다.
Undistraction

버킷을 저장하려고 할 때 CLI에서 오류가 발생했습니다. 이는 완벽하게 작동했습니다!
Lazar Kukolj

아, 그건 예기치 않은 일이었습니다. FTP에 사이버 덕을 이전에 사용했지만 S3 연결성을 기대하지는 않았습니다. 좋은 힌트 주셔서 감사합니다!
jskierbi

51

이를 수행 할 수있는 많은 옵션이 있지만 가장 좋은 방법은 AWS CLI를 사용하는 것입니다.

연습은 다음과 같습니다.

  1. 머신에 AWS CLI를 다운로드하여 설치하십시오.

  2. AWS CLI 구성 :

    여기에 이미지 설명을 입력하십시오

    계정을 만들 때받은 유효한 액세스비밀 키 를 입력했는지 확인하십시오 .

  3. 다음을 사용하여 S3 버킷을 동기화하십시오.

    aws s3 sync s3://yourbucket /local/path
    

    위의 명령에서 다음 필드를 바꾸십시오.

    • yourbucket >> 다운로드하려는 S3 버킷.
    • /local/path >> 모든 파일을 다운로드하려는 로컬 시스템의 경로.

Cyberduck은 다운로드를 시작하기 전에 파일을 "준비"해야하기 때문에 cyberduck 대신 이것을 사용했습니다. 많은 시간이 걸리는 파일의 경우 실제로 "준비"기능에 대한 정보를 찾을 수 없었습니다. CLI가 즉시 다운로드를 시작했습니다
Tashows

s3://버킷 이름에 해당 접두사 가 있는지 확인하십시오 !!! 으로 aws s3 ls당신이 필요하지 않은 s3://접두사를하지만 당신은 필요한 cp명령.
cjmling

43

AWS S3 CLI를 사용하여 다운로드하려면 :

aws s3 cp s3://WholeBucket LocalFolder --recursive
aws s3 cp s3://Bucket/Folder LocalFolder --recursive

코드를 사용하여 다운로드하려면 AWS SDK를 사용하십시오.

GUI를 사용하여 다운로드하려면 Cyberduck을 사용하십시오.


1
일부 파일이나 폴더를 무시하는 방법?
Nabin

1
@Nabin 다음과 같이 파일 또는 폴더를 제외하기 위해 --include & --exclude with wildcard를 사용할 수 있습니다. aws s3 cp s3://my-bucket-name ./local-folder --recursive --include "*" --exclude "excludeFolder/*" --exclude "includeFolder/excludeFile.txt"
DarkCenobyte

21

Windows의 경우 S3 브라우저 는 내가 찾은 가장 쉬운 방법입니다. 뛰어난 소프트웨어이며 비상업적 용도로는 무료입니다.


3
방금 "모든 파일 다운로드 ..."옵션을 시도했습니다 ( "S3 버킷 전체 다운로드"와 동일하다고 가정하고 Pro 버전이 필요하다고 말했습니다.
Jack Ukleja

2
업데이트 : 그러나 나는 양동이 안에 전체 폴더를 다운로드 할 수 있었고 내 필요에 충분했습니다 ...
Jack Ukleja

예, 무료 버전은 꽤 제한되어 있습니다. 모두 선택하여 다운로드 할 수 있지만 동시 전송은 2 회로 제한됩니다
Hayden Thring

Ubuntu 17.1 및 s3cmd에서 python3 지원 오류가 발생한 후 Windows 간단한 버전을 찾고 있었지만 잘 작동했습니다.
edencorbin

21

Visual Studio를 사용하는 경우 " AWS Toolkit for Visual Studio " 다운로드하십시오 .

설치 후 Visual Studio-AWS Explorer-S3-버킷-두 번 클릭으로 이동하십시오.

창에서 모든 파일을 선택할 수 있습니다. 마우스 오른쪽 버튼을 클릭하고 파일을 다운로드하십시오.


12

이 명령을 AWS CLI 와 함께 사용하십시오 .

aws s3 cp s3://bucketname . --recursive

12

일부 OS X 사용자를 도울 수있는 다른 옵션은 전송입니다.

S3 파일에 연결할 수있는 FTP 프로그램입니다. 또한 FTP 또는 S3 저장소를 Finder의 폴더로 마운트하는 옵션이 있지만 제한된 시간 동안 만 사용할 수 있습니다.


12

@Layke의 대답은 좋지만 데이터가 많고 영원히 기다리지 않으려면 " AWS CLI S3 구성 "을 읽어야 합니다.

다음 명령은 AWS CLI에 1,000 개의 스레드를 사용하여 작업 (각각 작은 파일 또는 여러 부분 복사본의 일부)을 실행하고 100,000 개의 작업을 미리 보도록 지시합니다.

aws configure set default.s3.max_concurrent_requests 1000
aws configure set default.s3.max_queue_size 100000

이를 실행 한 후 간단한 sync명령을 사용할 수 있습니다 .

aws s3 sync s3://source-bucket/source-path s3://destination-bucket/destination-path

또는

aws s3 sync s3://source-bucket/source-path c:\my\local\data\path

CPU 4 코어 및 16GB RAM이 장착 된 시스템에서 광산 (3-50GB 파일)과 같은 경우 동기화 / 복사 속도는 기본 구성에 비해 속도가 약 9.5MiB / s에서 700 + MiB / s로 70 배 증가했습니다.


1
이것이 실제 답변입니다. 방금 테스트 한 ec2에서 약 2.3GB / 분이 전송되었습니다. 약 1GB / 분의 동시 옵션없이 생명의 은인.
Karsten

9

S3를 약간 개발했지만 전체 버킷을 다운로드하는 간단한 방법을 찾지 못했습니다.

Java로 코딩하려면 jets3t lib를 사용하여 버킷 목록을 만들고 해당 목록을 반복하여 다운로드하십시오.

먼저 AWS 관리 영사관에서 공개 프라이빗 키 세트를 가져 와서 S3service 객체를 생성 할 수 있습니다.

AWSCredentials awsCredentials = new AWSCredentials(YourAccessKey, YourAwsSecretKey);
s3Service = new RestS3Service(awsCredentials);

그런 다음 버킷 객체 배열을 가져옵니다.

S3Object[] objects = s3Service.listObjects(YourBucketNameString);

마지막으로 해당 배열을 반복하여 객체를 한 번에 하나씩 다운로드하십시오.

S3Object obj = s3Service.getObject(bucket, fileName);
            file = obj.getDataInputStream();

스레드 코드 싱글 톤에 연결 코드를 넣었습니다. 필요한 try / catch 구문은 명백한 이유로 생략되었습니다.

오히려 파이썬으로 코딩하려면 Boto를 대신 사용할 수 있습니다.

BucketExplorer를 둘러 본 후 " 전체 버킷 다운로드 "는 원하는 작업을 수행 할 수 있습니다.


Java 솔루션이 필요하지 않은 경우 위의 aws cli answer를 사용하십시오.
jeremyjjbrown

새 폴더를 만들 수 있습니다
Jisson

7

AWS SDK API는 전체 폴더 및 리포지토리를 s3에 업로드하고 s3의 전체 버킷을 로컬로 다운로드하는 최상의 옵션입니다.

전체 폴더를 s3에 업로드

aws s3 sync . s3://BucketName

로컬로 전체 s3 버킷 다운로드

aws s3 sync s3://BucketName . 

s3의 특정 폴더에 대해 BucketName / Path와 같은 경로를 다운로드 할 수도 있습니다.


6

https://github.com/minio/mc 로이 작업을 수행 할 수 있습니다 .

mc cp -r https://s3-us-west-2.amazonaws.com/bucketName/ localdir

mc는 세션, 재개 가능한 다운로드, 업로드 등을 지원합니다. mcLinux, OS X 및 Windows 운영 체제를 지원합니다. Golang으로 작성되었으며 Apache 버전 2.0에서 릴리스되었습니다.


5

S3Fox와 함께 Firefox를 사용하는 경우, 그 파일을 사용하여 모든 파일을 선택하고 (Shift-Select First and Last) 마우스 오른쪽 단추를 클릭 한 후 모두 다운로드 ... 문제가없는 500 개 이상의 파일로 수행했습니다.


"의사 폴더"가 AWS 콘솔에서 생성 된 경우에도 버킷 내의 하위 폴더에는 작동하지 않습니다. (이 글을 쓰는 시점에서)
웨슬리

작동하지 않는 것으로 확인되면 약 12k 개의 최상위 키 = 하위 폴더가 있음), S3Fox도 시작되지 않습니다. 또한 모든 버킷을 나열 할 수있는 권한을 주장하십시오!
피터 라다


3

당신은 단지 거기 (하위 디렉토리)에 파일을하지 않은 경우 빠른 솔루션은 모든 (파일 선택하는 것입니다 click처음에, Shift+click마지막에) 및 히트를 Enter하거나 right click선택합니다 Open. 대부분의 데이터 파일은 컴퓨터로 바로 다운로드됩니다.


3

다른 GUI 옵션을 추가하기 위해 WinSCP의 S3 기능을 사용 합니다 . UI에 액세스 키와 비밀 키만 있으면 연결이 매우 쉽습니다. 그런 다음 중첩 폴더의 재귀 다운로드를 포함하여 액세스 가능한 버킷에서 필요한 파일을 찾아 다운로드 할 수 있습니다.

보안을 통해 새 소프트웨어를 지우는 것이 어려울 수 있으며 WinSCP가 널리 보급되어 있으므로보다 전문화 된 유틸리티를 설치하는 대신 소프트웨어를 사용하는 것이 실제로 유리할 수 있습니다.


1
  1. Windows 사용자는 설치 링크가있는이 링크에서 S3EXPLORER를 다운로드해야합니다.- http ://s3browser.com/download.aspx

  2. 그런 다음 비밀 키, 액세스 키 및 s3explorer에 대한 리전과 같은 AWS 자격 증명을 제공하십시오.이 링크에는 s3explorer : 브로 더의 복사 붙여 넣기 링크에 대한 구성 지침이 포함되어 있습니다. s3browser.com/s3browser-first-run.aspx

  3. 이제 모든 s3 버킷이 s3explorer의 왼쪽 패널에 표시됩니다.

  4. 버킷을 선택하고 왼쪽 상단에서 버킷 메뉴를 클릭 한 다음 메뉴에서 모든 파일 다운로드 옵션을 선택하십시오. 아래는 동일한 스크린 샷입니다.

버킷 선택 화면

  1. 그런 다음 폴더를 찾아 특정 위치에서 버킷을 다운로드하십시오.

  2. 확인을 클릭하면 다운로드가 시작됩니다.


1

AWS Sync는 완벽한 솔루션입니다. 두 가지 방법으로하지 않습니다. 소스에서 대상까지의 한 가지 방법입니다. 또한 버킷에 많은 항목이있는 경우 다운로드가 더 빨리 발생하도록 (인터넷을 통해가 아니라 인트라넷을 통해) 다운로드가 더 빨리 이루어 지도록 s3 엔드 포인트를 먼저 만드는 것이 좋습니다.


1

다음은 모든 버킷을 다운로드하여 나열하고 내용을 나열하는 내용입니다.

    //connection string
    private static void dBConnection() {
    app.setAwsCredentials(CONST.getAccessKey(), CONST.getSecretKey());
    conn = new AmazonS3Client(app.getAwsCredentials());
    app.setListOfBuckets(conn.listBuckets());
    System.out.println(CONST.getConnectionSuccessfullMessage());
    }

    private static void downloadBucket() {

    do {
        for (S3ObjectSummary objectSummary : app.getS3Object().getObjectSummaries()) {
            app.setBucketKey(objectSummary.getKey());
            app.setBucketName(objectSummary.getBucketName());
            if(objectSummary.getKey().contains(CONST.getDesiredKey())){
                //DOWNLOAD
                try 
                {
                    s3Client = new AmazonS3Client(new ProfileCredentialsProvider());
                    s3Client.getObject(
                            new GetObjectRequest(app.getBucketName(),app.getBucketKey()),
                            new File(app.getDownloadedBucket())
                            );
                } catch (IOException e) {
                    e.printStackTrace();
                }

                do
                {
                     if(app.getBackUpExist() == true){
                        System.out.println("Converting back up file");
                        app.setCurrentPacsId(objectSummary.getKey());
                        passIn = app.getDataBaseFile();
                        CONVERT= new DataConversion(passIn);
                        System.out.println(CONST.getFileDownloadedMessage());
                    }
                }
                while(app.getObjectExist()==true);

                if(app.getObjectExist()== false)
                {
                    app.setNoObjectFound(true);
                }
            }
        }
        app.setS3Object(conn.listNextBatchOfObjects(app.getS3Object()));
    } 
    while (app.getS3Object().isTruncated());
}

/ ---------------------------- 확장 방법 ------------------- ------------------ /

//Unzip bucket after download 
public static void unzipBucket() throws IOException {
    unzip = new UnZipBuckets();
    unzip.unZipIt(app.getDownloadedBucket());
    System.out.println(CONST.getFileUnzippedMessage());
}

//list all S3 buckets
public static void listAllBuckets(){
    for (Bucket bucket : app.getListOfBuckets()) {
        String bucketName = bucket.getName();
        System.out.println(bucketName + "\t" + StringUtils.fromDate(bucket.getCreationDate()));
    }
}

//Get the contents from the auto back up bucket
public static void listAllBucketContents(){     
    do {
        for (S3ObjectSummary objectSummary : app.getS3Object().getObjectSummaries()) {
            if(objectSummary.getKey().contains(CONST.getDesiredKey())){
                System.out.println(objectSummary.getKey() + "\t" + objectSummary.getSize() + "\t" + StringUtils.fromDate(objectSummary.getLastModified()));
                app.setBackUpCount(app.getBackUpCount() + 1);   
            }
        }
        app.setS3Object(conn.listNextBatchOfObjects(app.getS3Object()));
    } 
    while (app.getS3Object().isTruncated());
    System.out.println("There are a total of : " + app.getBackUpCount() + " buckets.");
}

}


1

s3cmd 명령으로 간단하게 얻을 수 있습니다 .

s3cmd get --recursive --continue s3://test-bucket local-directory/

1

Neel Bhaat이이 블로그 에서 설명했듯이이 목적으로 사용할 수있는 다양한 도구가 있습니다. 일부는 AWS가 제공하며 대부분은 타사 도구입니다. 이러한 모든 도구를 사용하려면 도구 자체에 AWS 계정 키와 비밀을 저장해야합니다. 저장하는 자격 증명으로 인해 전체 비용이 발생하고 사망 할 수 있으므로 타사 도구를 사용할 때는 매우주의해야합니다.

따라서 항상 이 목적으로 AWS CLI 를 사용하는 것이 좋습니다 . 이 링크 에서 간단히 설치할 수 있습니다 . 다음 명령을 실행하고 키, 비밀 값을 AWS CLI에 저장하십시오.

aws configure

다음 명령을 사용하여 AWS S3 버킷을 로컬 머신과 동기화하십시오. (로컬 머신에는 AWS CLI가 설치되어 있어야합니다)

aws s3 sync <source> <destination>

예 :

1) AWS S3에서 로컬 스토리지로

aws s3 sync <S3Uri> <LocalPath>

2) 로컬 스토리지에서 AWS S3로

aws s3 sync <LocalPath> <S3Uri>

3) AWS s3 버킷에서 다른 버킷으로

aws s3 sync <S3Uri> <S3Uri> 

예를 들어, 3 버킷 폴더에서 다른 버킷 폴더를 가리킬 수 있습니까? 실제로 버킷 폴더를 다른 버킷 폴더와 동기화하고 싶습니다.
lukai

@lukai 예. 내가 예 3에 주어진 것을이 당신은 단순히 가지고있는 S3 버킷의 URI 소스 및 대상의 할 필요가있다
Keet Sugathadasa

1

AWS에서 버킷 만 다운로드하려면 먼저 머신에 AWS CLI를 설치하십시오. 터미널에서 파일을 다운로드 할 디렉토리로 변경하고이 명령을 실행하십시오.

aws s3 sync s3://bucket-name .

로컬 및 s3 디렉토리를 모두 동기화하려면 (로컬 폴더에 일부 파일을 추가 한 경우) 다음 명령을 실행하십시오.

aws s3 sync . s3://bucket-name


1

이 AWS cli 명령을 사용하여 전체 S3 버킷 컨텐츠를 로컬 폴더로 다운로드 할 수 있습니다

aws s3 sync s3://your-bucket-name "Local Folder Path"

이런 오류가 보이면

fatal error: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)

--no-verify-ssl (부울)

기본적으로 AWS CLI는 AWS 서비스와 통신 할 때 SSL을 사용합니다. 각 SSL 연결에 대해 AWS CLI는 SSL 인증서를 확인합니다. 이 옵션은 SSL 인증서 확인의 기본 동작을 무시합니다. 참고

이 태그를 --no-verify-ssl 명령과 함께 사용하십시오

aws s3 sync s3://your-bucket-name "Local Folder Path" --no-verify-ssl

의 사용은 s3 sync이미 여러 번 위에 설명되어 있습니다. + --no-verify-ssl보안 결과를 설명하지 않고 사용을 제안하는 것은 범죄입니다.
Martin Prikryl 2016 년

보안 정보에 감사드립니다. 이 문제에 직면하여이 참조 docs.aws.amazon.com/cli/latest/reference를
Dimuthu

1

버킷이 상당히 크면 s4cmd병렬 연결을 만들고 다운로드 시간을 향상시키는 명령이 있습니다.

데비안에서 설치하려면

apt install s4cmd

핍이있는 경우 :

pip install s4cmd

~/.s3cfg파일이 있으면 (설치 s3cmd및 실행 하지 않은 경우) 파일 을 읽 s3cmd --configure거나 --access-key=ACCESS_KEY --secret-key=SECRET_KEY명령에서 지정할 수 있습니다 .

진료소는와 유사합니다 s3cmd. 귀하의 경우 sync파일을 다시 다운로드하지 않고도 다운로드를 취소하고 다시 시작할 수 있으므로 a 를 권장합니다.

s4cmd [--access-key=ACCESS_KEY --secret-key=SECRET_KEY] sync s3://<your-bucket> /some/local/dir

많은 양의 데이터 (1TB 이상)를 다운로드하는 경우 청구서에 영향을 줄 수 있으므로 먼저 계산하십시오.


0

@layke가 말했듯이 S3 cli에서 파일을 다운로드하는 것이 가장 안전하고 안전합니다. 그러나 어떤 경우에는 사람들이 wget을 사용하여 파일을 다운로드해야하며 여기에 해결책이 있습니다.

aws s3 presign s3://<your_bucket_name/>

presign_url을 사용하여 preget_url을 사용하여 S3에서 콘텐츠를 다운로드하는 데 사용할 수있는 임시 공개 URL을 미리 서명합니다.이 경우 wget 또는 다른 다운로드 클라이언트를 사용합니다.


0

이 명령을 시도하십시오 :

aws s3 sync yourBucketnameDirectory yourLocalDirectory

예를 들어 버킷 이름이 myBucket이고 로컬 디렉토리가 인 c:\local경우 다음을 수행하십시오.

aws s3 sync s3://myBucket c:\local

awscli에 대한 자세한 내용은 aws cli 설치를 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.