ãããããã¯çŽ æŽãããæ©èœã«ãªããšæããŸãã ããã¯æ°ããs3ãµãã³ãã³ãã«ãªããšæããŸããïŒ ãµãã³ãã³ããç°¡åã«è¿œå ã§ããããã«ãs3ã³ãã³ãã³ãŒãã®å
éšå€æŽã«åãçµãã§ããŸãã ç§ã¯ãªãã¡ã¯ã¿ãªã³ã°ãéå§ããããã«ããã䜿çšããŠããls
ã§å ±åãããåé¡ã®ããã€ãä¿®æ£ããã³ãã³ãls
ã
ãŸã å®å
šã«ã¯å®äºããŠããŸãããããããŸã§ã®ãšãã次ã®ããã«ãªã£ãŠããŸãã
https://github.com/jamesls/aws-cli/compare/s3-ls-permissions#diff -b88a66f4bd148577a9390cb980d7eeb9R321
ã¯ããããã¯ç§ãæ¢ããŠãããã®ã§ãã æéã ãã§ãªããç¹å®ã®æ¥æã§ãæå¹æéãæå®ã§ããããã«ããŠãã ããã UTCã¿ã€ã ãŸãŒã³ãISO圢åŒããã«ç§ãå¿ èŠãªããããZãã§çµããæååã¯äœ¿ããããããã§ãïŒäŸïŒã2014-05-30T00ïŒ00ïŒ00ZãïŒã
æ¬åœã«ã³ãã³ãã©ã€ã³ããtmpurlãçæããå¿ èŠãããå Žåã¯ãã³ãã³ãã©ã€ã³ããŒã«s3tmpgenããå§ãããŸã
ãšã«ãããç§ã¯æ¬åœã«ãã®ãããªæ©èœãAWS CLIã«æåŸ ããŸããããã¯ãAWSS3ã§ã®æ¥åžžæ¥åã«ãšã£ãŠè²ŽéãªããŒã«ã«ãªããŸããã
+1
+1
S3ã䜿çšããŠãHerokuã«ãããã€ããã³ãŒããã³ãã«ããã¹ãããããšãæ€èšããŠããŸããããã¯çŽ æŽãããæ©èœã§ã:)
https://blog.heroku.com/archives/2014/5/22/introducing_the_app_json_application_manifest
+1
+1ã¯AWSCLIã§ãããæã£ãŠãããšçŽ æŽãããã§ããã
ããã«ãã©ãçãã人ãžã®ã¡ã¢ã§ããã boto
ã©ã€ãã©ãªã«ã¢ã¯ã»ã¹ããããšã§ç°¡åã«ãããè¡ãããšãã§ããŸãïŒ //boto.readthedocs.org/en/latest/ref/s3.html#boto .s3.key.Key.generate_url
ãã£ãŒãããã¯ããå¯ãããã ãããããšãããããŸãã ãããèŠãŠãããŸãããããAWSCLIã«è¿œå ããåªããæ©èœã«ãªãããšã«åæããŸãã
ããããšãã@ johnboxallã Botoã¯ç¢ºãã«ãªãã·ã§ã³ã§ããããã€ãã£ãPythonå±éãªãã§cliãã€ããªãå±éãã人ã ïŒWindowsãŠãŒã¶ãŒãèããŠãã ããïŒã«ãšã£ãŠããã®ã«ãŒããé²ãããšã¯ãPowerShellSDKããã«ããŠã³ããŠ.NETSDKãä»ããŠè¡ãã®ãšåããããã®äœæ¥ã§ãã CLIã§ãã®ãã€ãã£ããåŒãç¶ã衚瀺ãããã ïŒãã€ãªïŒ
ãããaws-cliã«è¿œå ããããŸã§ãä»ã®ãšããbotoãçŽæ¥äœ¿çšããããšèããŠãã人ã®ããã«ãç°¡åãªãµã³ãã«æé ãè¿œå ãããšæããŸããã ç§ã¯ä»ãããæ°åæ¢ãã«è¡ããŸããããããŠããããã®ãã±ãããš@johnboxallã³ã¡ã³ããšäžç·ã«ãããæã£ãŠãããã§ãã ããã¯äžéšã®äººã«ãšã£ãŠã¯éåžžã«æçœãããããŸããããPython以å€ã®éçºè ã«ãšã£ãŠã¯ããã§ã¯ãããŸãã
ãã§ã«Pythonãã€ã³ã¹ããŒã«ãããŠããããã¯ã¹
$ python --version
Python 2.7.6
$ sudo pip install boto
$ python
>>> import boto
>>> s3 = boto.connect_s3()
>>> bucket = s3.get_bucket('your-bucket-name')
>>> key = bucket.get_key('the-prefix/the-name-of-the-object.mp4')
>>> key.generate_url(3600)
'https://your-bucket-name.s3.amazonaws.com/the-prefix/the-name-of-the-object.mp4?Signature=CgDfFa45DBXFiMfASxSTpiSuHKM%3D&Expires=1415913273&AWSAccessKeyId=ABCDEDKSY344ACVDG'
@ isleshocky77ã®äŸã«
$ cat boto-get-signed-url.py
#!/usr/bin/python
import boto
import argparse
parser = argparse.ArgumentParser(description='Generate an S3 signed URL')
parser.add_argument('-b', '--bucket', help='bucket name')
parser.add_argument('-k', '--key', help='prefix/key')
parser.add_argument('-s', '--seconds', type=int, help='time in seconds until the URL will expire')
args = parser.parse_args()
s3 = boto.connect_s3()
bucket = s3.get_bucket(args.bucket)
key = bucket.get_key(args.key)
if bucket.get_key(args.key):
print key.generate_url(args.seconds)
else:
print 's3://' + args.bucket + '/' + args.key + ' does not exist'
$ ./boto-get-signed-url.py -b superbucket -k "test" -s 60
https://superbucket.s3.amazonaws.com/test?Signature=n6cO8RH%2FbNwQhuZVNNazo3q04x0%3D&Expires=1416695021&AWSAccessKeyId=AKIEXAMPLEKEYNOTREAL
$ boto-get-signed-url.py --help
usage: boto-get-signed-url.py [-h] [-b BUCKET] [-k KEY] [-s SECONDS]
Generate an S3 signed URL
optional arguments:
-h, --help show this help message and exit
-b BUCKET, --bucket BUCKET
bucket name
-k KEY, --key KEY prefix/key
-s SECONDS, --seconds SECONDS
time in seconds until the URL will expire
ããã«ã¡ã¯ãã¿ããª
ãã®åé¡ã®ã¹ããŒã¿ã¹ã«ã€ããŠããäžåºŠç¢ºèªããåŸãããŒã«s3tmpgenãæäŸããPythonããã±ãŒãžttr.aws.utils.s3ãæŽæ°ã-http
ïŒhttpã䜿çšããŠURLãçæã§ããŸãã
ãããawscliãœãªã¥ãŒã·ã§ã³ã«çœ®ãæããããšããŸã 楜ãã¿ã«ããŠããŸãã
ïŒ+1ïŒ
s3ã§çœ²åãããURLãCLIã®äžéšã«ãªãå Žåã¯+1
ïŒ+1ïŒ
+1
ãªããããªã«æéããããã®ããç§ã¯ç解ããŠãããšæããŸããç©äºã¯é çªã«è¡ãããªããã°ãªãããè¯ãããšã¯ãããŒããããäžã«ããããã«èŠããããšã§ãã
AWSCLIã¯botocore
ã«åºã¥ããŠãããããæåã«ããã§è§£æ±ºããå¿
èŠããããŸãã boto / botocoreïŒ291ããããæ±ããŠããŸãã
ãã«ãªã¯ãšã¹ãboto / botocoreïŒ504ã¯ãã§ã«ãã©ã³ãclients-only
ããŒãžãããŠãããããŒããããïŒREADMEã®https://github.com/boto/botocoreã«èšèŒïŒã¯äž»åŒµããŠããŸããbotocoreã¯çŸåšããã©ã³ãclients-only
ããŒãžããåã®äžæ©ã§ãã
@vlcinsky
ã¯ããã¯ã©ã€ã¢ã³ãå°çšãã©ã³ããbotocoreã«ããŒãžããããšãCLIã§çœ²åä»ãURLã®çæãååŸã§ããããã«ãªããŸãã 次ã«ãCLIåŽã§å®è¡ããå¿ èŠãããäž»ãªäœæ¥éã¯ãæ©èœãå ¬éããåªããAPIãäœæããããšã§ãã
https://github.com/boto/botocore/issues/291ã¯6æ23æ¥ã«ãã§ã«ééãããŠãããã®æ©èœã¯çŸåšbotocoreã§å©çšå¯èœã§ããã
ïŒ+1ïŒç¢ºãã«äŸ¿å©ãªæ©èœã«ãªããŸã
+1
@kyleknapãææããããã«ã
次ã®ãŠãŒã¹ã±ãŒã¹ããããŸãã
ãtmpGETãã¯ãåºåãurlã®ã¿ã§ãå
¥åããã±ãã/ããŒãšæå¹æéã®ã¿ã§ãããããéåžžã«ç°¡åã§ãã
æ¥ä»ïŒæå¹æéïŒã
ãtmpPOSTãã¯ãæçš¿ã®ããªã·ãŒãå®çŸ©ããå¿ èŠããããããã¯ããã«è€éã§ãã
解決ãã¹ã1ã€ã®è³ªåã¯ããããã®ã¢ã¯ã·ã§ã³ãã©ãã«çœ®ãããšããããšã§ãã2ã€ã®éžæè¢ãããããã§ãã
aws s3
aws s3api
ä»æ¥ã¯ãããè€éãªãtmpPOSTãã«ã€ããŠã¯æ±ããŸãããããåçŽãªãtmpGETãã«çŠç¹ãåœãŠãŸãã
aws s3 tmpurl
è¿œå ããŸããã®ãããªãœãªã¥ãŒã·ã§ã³ã¯å®è£
ãããªãç°¡åã§ãå®éã®80ïŒ
ã§åœ¹ç«ã¡ãŸã
ã·ãã¥ãšãŒã·ã§ã³ã䜿çšããŸãïŒãªããžã§ã¯ããAWS S3ã«å
¬éããå
±æããäžæçãªURLãæäŸããŸã
誰ããšïŒã
ãã®æŠå¿µã¯ãæ¢åã®aws s3 ls
ã«åºã¥ããŠæ§ç¯ãããŸããã次ã®éãããããŸãã
--expires
ãè¿œå ããŠãURLã®æå¹æéãåããæ¥æãå®çŸ©ãããã --expires-in
ãæãå
¥ããŸãããçŸåšãæ£ç¢ºãªç¬éã®tmp urlãäœæããç°¡åãªæ¹æ³ã¯ãªãã®ã§ãæåã«
ããŒãžã§ã³ã¯ãããã©ã«ãå€ã3600ç§ã®--expires-in
ãªãã·ã§ã³ã®ã¿ãæäŸããŸãã
AWSS3äžã®æ¢åã®ãªããžã§ã¯ãã®æ°ã«å¯ŸããŠäžé£ã®tmpURLãäœæããã®ã¯éåžžã«ç°¡åã§ãã ããã¯ä¿åããŸã
æ£ç¢ºãªãã±ãã/ããŒåã®å€ãååŸããéã®ããŒãã«ã
ãã®aws s3 ls
ããŒã¹ã®ã¢ãããŒãã®æ¬ ç¹ã¯ããªããžã§ã¯ãã®tmpurlãäœæã§ããªãããšã§ãã
ãŸã ååšããŠããŸããã
ãšã«ãããããã¯åŸã§aws s3api
ãœãªã¥ãŒã·ã§ã³ã«ãã£ãŠè§£æ±ºãããå¯èœæ§ããããŸãã
ãšãŠãããŸãããã«çœ®ããŠãã ããã æçš¿ã¯ãæçš¿ãããããŒã¿ã®ãµãŒããŒåŽã®åŠçãäžå¿ã«ã»ãŒç¢ºå®ã«æ§ç¯ããããã®ã§ãããgetã¡ãœããã®ãŠãŒã¹ã±ãŒã¹ã¯éåžžéåžžã«ç°¡åã§ãã ãããã»ãšãã©ã®ãŠãŒã¹ã±ãŒã¹ãã«ããŒãããšèšããšããç§ã¯åŒ·ãåæããŸãã
è¿œå ããã€ããã§ããããäžæURLã¯s3äžã®ãã¡ã€ã«ã®æ€çŽ¢ãšã¯äœã®é¢ä¿ããªããšæããŸãã 誰ãã眲åãããURLã®ã»ããå šäœãçæãããå Žåãããã¯cliãã©ããããããã«ãã以äžã®ããšãããå¿ èŠããªãè«çã§ãã tmpurlããªããã£ãã¯ãç§ã®é ã®äžã§å®è¡å¯èœãªæå°éã®è£œåã§ãã
ããŒã«ã«ãã©ã³ãã«s3ãªããžã§ã¯ãã®äºåã«èšå®ãããURLãå®è£ ããŸããïŒå®å šã§ã¯ãããŸããïŒã
https://github.com/quiver/aws-cli/tree/s3-presigned-url
ããã¯botocore.generate_presigned_url
èãã©ãããŒã§ããããŸã æ¬çªç°å¢ã«å¯Ÿå¿ããŠããŸããã @vlcinskyãææããããã«ã AWSCLI
ãããªåªããAPIèšèšãå¿
èŠã§ãã ãããä¿®æ£ãããããç§ã¯ãããå®è£
ããããšãã§ããŸãã
ç§ã泚æããããšã®1ã€ã¯ã generate_presigned_url
ã¯client_method
ãã©ã¡ãŒã¿ãŒãå¿
èŠã§ãããšããããšã§ãããã®ãã©ã¡ãŒã¿ãŒã¯ããµã€ã³ãªã³ããS3 APIïŒäŸïŒ get_object
ïŒãæå®ããŸãã ç§ã®çŸåšã®å®è£
ã§ã¯ããŠãŒã¶ãŒã«å
¬éãããŠããŸãããããŸããŸãªãµãã³ãã³ãïŒ aws s3 geturl
ã aws s3 uploadurl
ïŒãã¹ã€ãããªãã·ã§ã³ïŒ --type upload
ïŒãæäŸãããªã©ããŠãŒã¶ãŒãã¬ã³ããªãŒã§ããæ¹ãããã§ãããã
$ echo hello world > test.txt
$ aws s3 url s3://BUCKET/test.txt --client-method put_object --expires-in 180
https://BUCKET.s3.amazonaws.com/test.txt?AWSAccessKeyId=AKIAIXXXXXXXXXXXXXXX&Expires=1451449621&Signature=KgwO9lBx942fFvln0JW0NX7mKS0%3D
$ URL=`aws s3 url s3://BUCKET/test.txt --client-method put_object --expires-in 180`
$ curl -D - -X PUT --upload-file test.txt $URL
HTTP/1.1 100 Continue
HTTP/1.1 200 OK
x-amz-id-2: /90B1axPysBg3P8kv8BlR8RoqdO1JfajCN5BM5/TxIT3VjGphKmyGX8EgCQEtCXYhuNkVne5+GM=
x-amz-request-id: 685F03CA6C84FAC0
Date: Wed, 30 Dec 2015 05:18:38 GMT
ETag: "6f5902ac237024bdd0c176cb93063dc4"
Content-Length: 0
Server: AmazonS3
$ aws s3 cp s3://BUCKET/test.txt -
hello world
$ URL=`aws s3 url s3://BUCKET/test.txt --client-method get_object --expires-in 180`
$ curl -D - -X GET $URL
HTTP/1.1 200 OK
x-amz-id-2: WuRokcBm9wnDMaRkD8kNeGijuKEzVp3eagi7JbpPXmmchEljsiP4wZX5w1TaeuK94n2526FGKMI=
x-amz-request-id: 1EBCAA7A691A577D
Date: Wed, 30 Dec 2015 05:20:14 GMT
Last-Modified: Wed, 30 Dec 2015 05:19:15 GMT
ETag: "6f5902ac237024bdd0c176cb93063dc4"
Accept-Ranges: bytes
Content-Type: binary/octet-stream
Content-Length: 12
Server: AmazonS3
hello world
äžèšã®Pythonã¯æ¬¡ã®ãããªURLãçæããŸãïŒ 'httpsïŒ//
ãã¡ã€ã«ãã«ãŒã«ããããšãããšãSSL蚌ææžã®åé¡ãçºçããŸãïŒç¡å¹ãªèšŒææžãã§ãŒã³
ãªãã·ã§ã³-kã䜿çšããŠã«ãŒã«ãããšããããä¹ãè¶ããããšãã§ããŸãããURLã次ã®ããã«ãªã£ãŠããå ŽåãããããŸãïŒ '
蚌ææžã¯æå¹ã§ãããURLãå€æŽããæ¹æ³ããã®ä»ã®ä¿®æ£ã¯ãããŸããïŒ
ããããšãã
ã®ã£ãªãŒ
äŸïŒ ' httpsïŒ//s3-us-west-1.amazonaws.com/bucket/dir/dir/file '
æŽæ°ãboto3ã䜿çšããŠãæ£ãã眲åãããURLãçæã§ããŸããã
+1
å°è±¡ç-3幎éã§ãå ¬åŒCLIããŒã«ã¯botoãšs3cmdã«ååšããŸãããå®è£ ããã眲åä»ãURLã®ãµããŒããååŸããŸãã
1+
+1
+1
ããã«é¢ããæŽæ°ã¯ãããŸããïŒ é©ããããšã«ãããã¯ãŸã å©çšã§ããŸããã
+1
åé¿çãšããŠ1ã€äœæããæåŸ ã©ããã«æ©èœããŸãïŒ //github.com/gdbtek/aws-tools
ã¿ãªãããããã«ã¡ã¯ããã£ãŒãããã¯ããããšãããããŸãã ããã¯ç§ãã¡ã®ããã¯ãã°ã«ãããã®ã§ãã æ£ç¢ºãªæ¥ä»ã¯ãŸã ããããŸãããããã«ãªã¯ãšã¹ããå±ã次第ããã®åé¡ã«ãªã³ã¯ããŸãã
çŽ æŽãããïŒ ããããšãïŒ
äºåã«çœ²åãããURLãs3ãã©ã«ããŒå šäœã«ååŸããããšã¯å¯èœã§ããïŒ ãã©ã«ãå ã移åããããã®Webã€ã³ã¿ãŒãã§ã€ã¹ãå«ããŸããïŒ
@tommedaäžå¯èœã§ãã äºåã«çœ²åãããURLã¯ãåžžã«åäžã®ä¿åããããªããžã§ã¯ãã«é¢é£ããŠããŸãã ããªãã話ããŠããããšã¯éçãªãŠã§ããµã€ãã«äŒŒãŠããŸããããããžã®ã¢ã¯ã»ã¹ãå¶åŸ¡ããããã«ïŒAWS S3ã«åºã¥ããŠããå ŽåïŒããããã·ãäœæããå¿ èŠããããŸãã ãã§ã«ããã€ãã®è©Šã¿ãååšããç§ã«ã¯ïŒçŽ1幎åã«èª¿æ»ãããïŒç°¡åãªãã®ã¯ãããŸããã§ããã
åãªããžã§ã¯ããžã®ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããäºåã«çœ²åãããURLãå«ãWebããŒãžããã€ã§ãçæããŠãããã€ã³ã¿ãŒãã§ã€ã¹ãs3ã«é 眮ããäºåã«çœ²åãããURLãã€ã³ã¿ãŒãã§ã€ã¹ã«è¿ãããšãã§ããŸãã ç°¡åãªããšã§ã¯ãããŸãããã€ã³ã¿ãŒãã§ãŒã¹ã¯äœ¿çšæ³ã«åºæã®ãã®ã«ããŸãã
æãåèã«ãªãã³ã¡ã³ã
å°è±¡ç-3幎éã§ãå ¬åŒCLIããŒã«ã¯botoãšs3cmdã«ååšããŸãããå®è£ ããã眲åä»ãURLã®ãµããŒããååŸããŸãã