•  


GitHub - johannesboyne/gofakes3: A simple fake AWS S3 object storage (used for local test-runs against AWS S3 APIs)
Skip to content

A simple fake AWS S3 object storage (used for local test-runs against AWS S3 APIs)

License

Notifications You must be signed in to change notification settings

johannesboyne/gofakes3

Folders and files

Name Name
Last commit message
Last commit date

Latest commit

 

History

325 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CircleCI Codecov

Logo

AWS (GOFAKE)S3

AWS S3 fake server and testing library for comprehensive S3 integration testing. This tool can be used to run a test server, for example, to support testing AWS Lambda functions that interact with S3. It also serves as a straightforward and convenient S3 mock and test server for various development needs.

Intended Use

GOFAKE)S3 is primarily designed for:

  • Local development of S3-dependent AWS Lambda functions.
  • Testing implementations with AWS S3 access.
  • Facilitating browser-based direct uploads to S3 in a local testing environment.

When Not to Use (GOFAKE)S3?

(GOFAKE)S3 should not be used as a production service. Its primary purpose is to aid in development and testing:

  • (GOFAKE)S3 is not designed for production-level data storage or handling.
  • It lacks the robustness required for safe, persistent access to production data.
  • The tool is still under development with significant portions of the AWS S3 API yet to be implemented. Consequently, breaking changes are expected.

For production environments, consider more established solutions. Some recommended alternatives can be found in the "Similar Notable Projects" section below.

How to use it?

Example (aws-sdk-go version 1)

// fake s3

backend
 :=
 s3mem
.
New
()
faker
 :=
 gofakes3
.
New
(
backend
)
ts
 :=
 httptest
.
NewServer
(
faker
.
Server
())
defer
 ts
.
Close
()

// configure S3 client

s3Config
 :=
 &
aws.
Config
{
	
Credentials
:      
credentials
.
NewStaticCredentials
(
"YOUR-ACCESSKEYID"
, 
"YOUR-SECRETACCESSKEY"
, 
""
),
	
Endpoint
:         
aws
.
String
(
ts
.
URL
),
	
Region
:           
aws
.
String
(
"eu-central-1"
),
	
DisableSSL
:       
aws
.
Bool
(
true
),
	
S3ForcePathStyle
: 
aws
.
Bool
(
true
),
}
newSession
 :=
 session
.
New
(
s3Config
)

s3Client
 :=
 s3
.
New
(
newSession
)
cparams
 :=
 &
s3.
CreateBucketInput
{
	
Bucket
: 
aws
.
String
(
"newbucket"
),
}

// Create a new bucket using the CreateBucket call.

_
, 
err
 :=
 s3Client
.
CreateBucket
(
cparams
)
if
 err
 !=
 nil
 {
	
// Message from an error.

	fmt
.
Println
(
err
.
Error
())
	
return

}

// Upload a new object "testobject" with the string "Hello World!" to our "newbucket".

_
, 
err
 =
 s3Client
.
PutObject
(
&
s3.
PutObjectInput
{
	
Body
:   
strings
.
NewReader
(
`{"configuration": {"main_color": "#333"}, "screens": []}`
),
	
Bucket
: 
aws
.
String
(
"newbucket"
),
	
Key
:    
aws
.
String
(
"test.txt"
),
})

// ... accessing of test.txt through any S3 client would now be possible

Example for V2 (aws-sdk-go-v2)

backend
 :=
 s3mem
.
New
()
faker
 :=
 gofakes3
.
New
(
backend
)
ts
 :=
 httptest
.
NewServer
(
faker
.
Server
())
defer
 ts
.
Close
()

// Difference in configuring the client


// Setup a new config

cfg
, 
_
 :=
 config
.
LoadDefaultConfig
(
	
context
.
TODO
(),
    
config
.
WithCredentialsProvider
(
credentials
.
NewStaticCredentialsProvider
(
"KEY"
, 
"SECRET"
, 
"SESSION"
)),
    
config
.
WithHTTPClient
(
&
http.
Client
{
        
Transport
: 
&
http.
Transport
{
            
TLSClientConfig
: 
&
tls.
Config
{
InsecureSkipVerify
: 
true
},
        },
    }),
    
config
.
WithEndpointResolverWithOptions
(
        
aws
.
EndpointResolverWithOptionsFunc
(
func
(
_
, 
_
 string
, 
_
 ...
interface
{}) (aws.
Endpoint
, 
error
) {
            
return
 aws.
Endpoint
{
URL
: 
ts
.
URL
}, 
nil

        }),
    ),
)

// Create an Amazon S3 v2 client, important to use o.UsePathStyle

// alternatively change local DNS settings, e.g., in /etc/hosts

// to support requests to http://<bucketname>.127.0.0.1:32947/...

client
 :=
 s3
.
NewFromConfig
(
cfg
, 
func
(
o
 *
s3.
Options
) {
	
o
.
UsePathStyle
 =
 true

})

Please feel free to check it out and to provide useful feedback (using github issues), but be aware, this software is used internally and for the local development only. Thus, it has no demand for correctness, performance or security.

There are two ways to run locally: using DNS, or using S3 path mode.

S3 path mode is the most flexible and least restrictive, but it does require that you are able to modify your client code.In Go, the modification would look like so:

config := aws.Config{}
config.WithS3ForcePathStyle(true)

S3 path mode works over the network by default for all bucket names.

If you are unable to modify the code, DNS mode can be used, but it comes with further restrictions and requires you to be able to modify your local DNS resolution.

If using localhost as your endpoint, you will need to add the following to /etc/hosts for every bucket you want to fake :

127.0.0.1 <bucket-name>.localhost

It is trickier if you want other machines to be able to use your fake S3 server as you need to be able to modify their DNS resolution as well.

Exemplary usage

Lambda Example

var
 AWS
   =
 require
(
'aws-sdk'
)


var
 ep
 =
 new
 AWS
.
Endpoint
(
'http://localhost:9000'
)
;

var
 s3
 =
 new
 AWS
.
S3
(
{
endpoint
: 
ep
}
)
;


exports
.
handle
 =
 function
 (
e
,
 ctx
)
 {

  s3
.
createBucket
(
{

    Bucket
: 
'<bucket-name>'
,

  }
,
 function
(
err
,
 data
)
 {

    if
 (
err
)
 return
 console
.
log
(
err
,
 err
.
stack
)
;

    ctx
.
succeed
(
data
)

  }
)
;

}

Upload Example

<
html
>

  <
head
>

    <
meta
 http-equiv
="
Content-Type
" 
content
="
text/html; charset=UTF-8
" />
  
</
head
>

  <
body
>


  <
form
 action
="
http://localhost:9000/<bucket-name>/
" 
method
="
post
" 
enctype
="
multipart/form-data
"
>

    Key to upload:
    
<
input
 type
="
input
"  
name
="
key
" 
value
="
user/user1/test/<filename>
" />
<
br
 />
    
<
input
 type
="
hidden
" 
name
="
acl
" 
value
="
public-read
" />
    
<
input
 type
="
hidden
" 
name
="
x-amz-meta-uuid
" 
value
="
14365123651274
" />
    
<
input
 type
="
hidden
" 
name
="
x-amz-server-side-encryption
" 
value
="
AES256
" />
    
<
input
 type
="
text
"   
name
="
X-Amz-Credential
" 
value
="
AKIAIOSFODNN7EXAMPLE/20151229/us-east-1/s3/aws4_request
" />
    
<
input
 type
="
text
"   
name
="
X-Amz-Algorithm
" 
value
="
AWS4-HMAC-SHA256
" />
    
<
input
 type
="
text
"   
name
="
X-Amz-Date
" 
value
="
20151229T000000Z
" />

    Tags for File:
    
<
input
 type
="
input
"  
name
="
x-amz-meta-tag
" 
value
="" />
<
br
 />
    
<
input
 type
="
hidden
" 
name
="
Policy
" 
value
='
<Base64-encoded policy string>
' />
    
<
input
 type
="
hidden
" 
name
="
X-Amz-Signature
" 
value
="
<signature-value>
" />
    File:
    
<
input
 type
="
file
"   
name
="
file
" /> 
<
br
 />
    
<!-- The elements after this will be ignored -->

    <
input
 type
="
submit
" 
name
="
submit
" 
value
="
Upload to Amazon S3
" />
  
</
form
>

</
html
>

Similar notable projects

Contributors

A big thank you to all the contributors , especially Blake @shabbyrobe who pushed this little project to the next level!

Help wanted

About

A simple fake AWS S3 object storage (used for local test-runs against AWS S3 APIs)

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

- "漢字路" 한글한자자동변환 서비스는 교육부 고전문헌국역지원사업의 지원으로 구축되었습니다.
- "漢字路" 한글한자자동변환 서비스는 전통문화연구회 "울산대학교한국어처리연구실 옥철영(IT융합전공)교수팀"에서 개발한 한글한자자동변환기를 바탕하여 지속적으로 공동 연구 개발하고 있는 서비스입니다.
- 현재 고유명사(인명, 지명등)을 비롯한 여러 변환오류가 있으며 이를 해결하고자 많은 연구 개발을 진행하고자 하고 있습니다. 이를 인지하시고 다른 곳에서 인용시 한자 변환 결과를 한번 더 검토하시고 사용해 주시기 바랍니다.
- 변환오류 및 건의,문의사항은 juntong@juntong.or.kr로 메일로 보내주시면 감사하겠습니다. .
Copyright ⓒ 2020 By '전통문화연구회(傳統文化硏究會)' All Rights reserved.
 한국   대만   중국   일본