λ€ μ’μ κΈ°λ₯μ΄ λ κ² κ°μμ. μ΄κ²μ΄ μλ‘μ΄ 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 S3λ₯Ό μ¬μ©νλ μΌμμ μΈ μμ μ κ·μ€ν λκ΅¬κ° λ AWS CLIμ μ΄λ¬ν κΈ°λ₯μ μ λ§ μ΄λνκ³ μΆμ΅λλ€.
+1
+1
Herokuμ λ°°ν¬ν μ½λ λ²λ€μ νΈμ€ν νκΈ° μν΄ S3λ₯Ό μ¬μ©νλ €κ³ ν©λλ€. μ΄κ²μ λ©μ§ κΈ°λ₯μ΄ λ κ²μ λλ€. :)
https://blog.heroku.com/archives/2014/5/22/introducing_the_app_json_application_manifest
+1
+1μ AWS CLIμ μμΌλ©΄ μ’μ κ²μ λλ€.
μ¬κΈ°κΉμ§ μ€λ μ¬λμ μν μ°Έκ³ μ¬νμ
λλ€. boto
λΌμ΄λΈλ¬λ¦¬μ λλ¬νμ¬ κ°λ¨νκ² μ§μ μ΄ μμ
μ μνν μ μμ΅λλ€. https://boto.readthedocs.org/en/latest/ref/s3.html#boto .s3.key.Key.generate_url
νΌλλ°±μ μ£Όμ μ κ°μ¬ν©λλ€. μ΄κ²μ μ΄ν΄λ³΄κ² μ΅λλ€. AWS CLIμ μΆκ°ν μ μλ νλ₯ν κΈ°λ₯μ΄λΌλ λ° λμν©λλ€.
@johnboxall κ°μ¬ν©λλ€. Botoλ νμ€ν μ΅μ μ΄μ§λ§ κΈ°λ³Έ Python λ°°ν¬ μμ΄ cli λ°μ΄λ리λ₯Ό λ°°ν¬νλ μ¬λλ€(Windows μ¬μ©μ μκ°)μ κ²½μ° ν΄λΉ κ²½λ‘λ‘ μ΄λνλ κ²μ PowerShell SDKλ₯Ό νλ€μ΄νκ³ .NET SDKλ₯Ό ν΅ν΄ μμ μ μννλ κ²λ§νΌμ΄λ λ§μ μμ μ λλ€. CLIμμ μ΄ λ€μ΄ν°λΈλ₯Ό κ³μ λ³΄κ³ μΆμ΅λλ€. :μ΄λ₯Ό λλ¬λ΄κ³ μλ€:
μ΄κ²μ΄ aws-cliμ μΆκ°λ λκΉμ§ μ§κΈμ botoλ₯Ό μ§μ μ¬μ©νλ €λ μ¬λμ μν΄ λΉ λ₯Έ μν μ§μΉ¨μ μΆκ°ν κ²μ΄λΌκ³ μκ°νμ΅λλ€. λλ μ΄μ μ΄κ²μ λμ΄ λ² μ°Ύμκ³ μ΄ ν°μΌκ³Ό μΆμ΅λλ€ . μ΄κ²μ μΌλΆμκ²λ λ§€μ° λͺ λ°±ν μ μμ§λ§ λΉ 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
μλ
νμΈμ μ¬λ¬λΆ
μ΄ λ¬Έμ μ μνμ λν λ λ€λ₯Έ κ²μ¬ ν λλ λꡬλ₯Ό μ 곡 ttr.aws.utils.s3 νμ΄μ¬ ν¨ν€μ§μ λν μ
λ°μ΄νΈλ₯Όνλ€ s3tmpgenμ . μ
λ°μ΄νΈλ₯Ό ν΅ν΄ httpsλ₯Ό μ¬μ©ν λΏλ§ μλλΌ ( -http
μ΅μ
μ μ¬μ©νμ¬) httpλ μ¬μ©νμ¬ URLμ μμ±ν μ μμ΅λλ€.
μ¬μ ν μ΄κ²μ awscli μ루μ μΌλ‘ κ΅μ²΄νκΈ°λ₯Ό κ³ λνκ³ μμ΅λλ€.
:+1:
s3 μλͺ λ URLμ΄ cliμ μΌλΆκ° λλλ‘ +1
:+1:
+1
μ κ·Έλ κ² μ€λ μκ°μ΄ 걸리λμ§ μ΄ν΄ν©λλ€. λͺ¨λ μΌμ΄ μμλλ‘ μ§νλμ΄μΌ νκ³ μ’μ μ μ λ‘λ맡μ μλ κ²μ²λΌ 보μ λλ€.
AWS CLIλ botocore
κΈ°λ°μΌλ‘ νλ―λ‘ λ¨Όμ ν΄κ²°ν΄μΌ ν©λλ€. boto/botocore#291μ΄(κ°) μμ²ν©λλ€.
ν μμ² BOTOμ / botocore # 504 μ΄λ―Έ μ§μ μ ν©λ³λμλ€ clients-only
λ° μ²κ΅¬ (https://github.com/boto/botocoreμμ READMEμ μΈκΈ λ) λ‘λ맡, νμ¬ λΆκΈ° λ³ν© μ΄μ μ ν λ¨κ³ botocoreμ
λλ€ clients-only
κ°λ°(λ² ν, GA λ° AWS CLIμλ μ°λ¦¬μκ² κΈ°λ₯μ μ 곡νλ "λ€μ΄ν°λΈ" λκ΅¬κ° μμ΅λλ€).
@vlcinsky
μ, ν΄λΌμ΄μΈνΈ μ μ© λΆκΈ°κ° botocoreμ λ³ν©λλ©΄ CLIμμ μλͺ λ URL μμ±μ μ νν μ μμ΅λλ€. κ·Έλ° λ€μ CLI μΈ‘μμ μνν΄μΌ νλ μ£Όμ μμ μ κΈ°λ₯μ λ ΈμΆνλ μ’μ APIλ₯Ό λ§λλ κ²μ λλ€.
https://github.com/boto/botocore/issues/291 μ 6μ 23μΌμ μ΄λ―Έ νμλμμ΅λλ€: "μ΄ κΈ°λ₯μ νμ¬ botocoreμμ μ¬μ©ν μ μμ΅λλ€."
:+1: μ λ§ νΈλ¦¬ν κΈ°λ₯μ΄ λ κ²μ λλ€.
+1
@kyleknapμ΄ μΈκΈνλ―μ΄ ν΄μΌ ν μΌ μ€ νλλ μ΄ κΈ°λ₯μ μν μ’μ APIλ₯Ό μ€κ³νλ κ²μ λλ€.
λ€μ μ¬μ© μ¬λ‘κ° μμ΅λλ€.
μ μΌν μΆλ ₯μ urlμ΄κ³ μ μΌν μ
λ ₯μ λ²ν·/ν€ λ° λ§λ£μ΄λ―λ‘ "tmpGET"μ μ λ§ μ½μ΅λλ€.
λ μ§(λ§λ£ μκ°).
"tmpPOST"λ κ²μ μ μ± μ μ μν΄μΌ νλ―λ‘ ν¨μ¬ λ 볡μ‘ν©λλ€.
ν΄κ²°ν΄μΌ ν ν κ°μ§ μ§λ¬Έμ μ΄λ¬ν μ‘°μΉλ₯Ό μ΄λμ λ κ²μΈμ§μ λν λ κ°μ§ λμμ΄ μλ€λ κ²μ λλ€.
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
μ΅μ
λ§ μ 곡ν©λλ€.
AWS S3μ κΈ°μ‘΄ κ°μ²΄ μμ λν tmp URL λ¬Άμμ μμ±νλ κ²μ λ§€μ° μ½μ΅λλ€. κ·Έκ²μ μ μ₯
μ νν λ²ν·/ν€ μ΄λ¦ κ°μ κ°μ Έμ€λ λ° μ₯μ λ¬Όμ΄ μμ΅λλ€.
μ΄ aws s3 ls
κΈ°λ° μ κ·Ό λ°©μμ λ¨μ μ κ°μ²΄μ λν tmp urlμ μμ±ν μ μλ€λ κ²μ
λλ€.
μμ§ μ‘΄μ¬νμ§ μμ΅λλ€.
μ΄μ¨λ μ΄κ²μ λμ€μ 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 λμμΈμ΄ νμν©λλ€. μΌλ¨ ν΄κ²°λλ©΄ ꡬνν μ μμ΅λλ€.
ν κ°μ§ μ£Όλͺ©ν΄μΌ ν μ μ generate_presigned_url
μλ μλͺ
ν S3 API(μ: get_object
)λ₯Ό μ§μ νλ client_method
맀κ°λ³μκ° νμνλ€λ κ²μ
λλ€. νμ¬ κ΅¬νμμλ μ¬μ©μμκ² λ
ΈμΆλμ§λ§ λ€λ₯Έ νμ λͺ
λ Ή( 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
μμ νμ΄μ¬μ '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
ν΄κ²° λ°©λ²μΌλ‘ νλλ₯Ό μμ±νμΌλ©° μμλλ‘ μλν©λλ€. https://github.com/gdbtek/aws-tools
μλ νμΈμ μ¬λ¬λΆ, νΌλλ°± μ£Όμ μ κ°μ¬ν©λλ€. μ΄κ²μ μ°λ¦¬μ λ°±λ‘κ·Έμ μλ κ²μ λλ€. μμ§ μ νν λ μ§λ μμ§λ§ ν 리νμ€νΈκ° λ°μνλ©΄ μ΄ λ¬Έμ μ λ§ν¬νκ² μ΅λλ€.
μμ²λ! κ°μ¬ν©λλ€!
μ 체 s3 ν΄λμ 미리 μλͺ λ URLμ κ°μ Έμ¬ μ μμ΅λκΉ? ν΄λλ₯Ό νμν μ μλ μΉ μΈν°νμ΄μ€κ° ν¬ν¨λμ΄ μμ΅λκΉ?
@tommeda λΆκ°λ₯ν©λλ€. 미리 μλͺ λ URLμ νμ λ¨μΌ μ μ₯λ κ°μ²΄μ κ΄λ ¨λ©λλ€. λΉμ μ΄ λ§νλ κ²μ μ μ μΉ μ¬μ΄νΈμ μ μ¬νμ§λ§ (AWS S3λ₯Ό κΈ°λ°μΌλ‘ νλ κ²½μ°) μ‘μΈμ€λ₯Ό μ μ΄νλ €λ©΄ νλ‘μλ₯Ό μμ±ν΄μΌ ν©λλ€. λͺ κ°μ§ μλκ° μ΄λ―Έ μ‘΄μ¬νμ§λ§ λμκ² (μ½ 1 λ μ μ μ‘°μ¬ν) μ¬μ΄ μλλ μμ΅λλ€.
νμ κ° κ°μ²΄μ λν μΈν°νμ΄μ€λ₯Ό μ 곡νκ³ κ° κ°μ²΄μ λν μ¬μ μλͺ λ URLμ ν¬ν¨νλ μΉ νμ΄μ§λ₯Ό μμ±ν λ€μ μΈν°νμ΄μ€λ₯Ό s3μ λ£κ³ μΈν°νμ΄μ€μ μ¬μ μλͺ λ URLμ λ°νν μ μμ΅λλ€. κ°λ¨νμ§ μκ³ μΈν°νμ΄μ€κ° νΉμ μ©λλ‘ μ¬μ©λκΈ°λ₯Ό μν©λλ€.
κ°μ₯ μ μ©ν λκΈ
μΈμμ - 3λ λμ 곡μ CLI λꡬλ boto λ° s3cmdμ μ‘΄μ¬νμ§λ§ μλͺ λ URLμ λν μ§μμ ꡬννμ§ λͺ»νμ΅λλ€.