Aws-cli: S3 рдПрдХреНрд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд URL рдХрд╛ рд╕рдорд░реНрдерди рдЙрддреНрдкрд╛рджрди

рдХреЛ рдирд┐рд░реНрдорд┐рдд 2 рдирд╡ре░ 2013  ┬╖  40рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: aws/aws-cli

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА - 3 рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕реАрдПрд▓рдЖрдИ рдЙрдкрдХрд░рдг рдХреЛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдпреВрдЖрд░рдПрд▓ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдирд╣реАрдВ рдорд┐рд▓рд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ boto рдФрд░

рд╕рднреА 40 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╣рд╛рдБ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдмрдбрд╝реА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдЧреАред рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдБ рдХрд┐ рдпрд╣ рдПрдХ рдирдпрд╛ s3 рдЙрдкрдХрдорд╛рдВрдб рд╣реЛрдЧрд╛? рдореИрдВ рдЙрдк рдХрдорд╛рдВрдб рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП s3 рдХрдорд╛рдВрдб рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдЖрдВрддрд░рд┐рдХ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ ls рд╕рд╛рде рд░рд┐рдкреЛрд░реНрдЯ рдХреА рдЧрдИ рдХрдИ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ls рдХрдорд╛рдВрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдЕрднреА рддрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрдм рддрдХ рд╣реИ:
https://github.com/jamesls/aws-cli/compare/s3-ls-permissions#diff -b88a66f4bd148577a9390cb980d7eeb9R321

рд╣рд╛рдБ, рдпрд╣ рдореИрдВ рдвреВрдВрдв рд░рд╣рд╛ рдерд╛ред рдХреГрдкрдпрд╛, рди рдХреЗрд╡рд▓ рдЕрд╡рдзрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдмрд▓реНрдХрд┐ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рджрд┐рдирд╛рдВрдХ рд╕рдордп рдХреЗ рдЕрдиреБрд╕рд╛рд░ рднреА рд╕рдорд╛рдкреНрддрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред рдпреВрдЯреАрд╕реА рдЯрд╛рдЗрдордЬрд╝реЛрди, рдЖрдИрдПрд╕рдУ рдкреНрд░рд╛рд░реВрдк, рдкреВрд░реНрдг рд╕реЗрдХрдВрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, "рдЬреЗрдб" рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореБрдЭреЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд▓рдЧрддреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП "2014-05-30T00:00:00Z")ред

рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╕реЗ tmpurl рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдореИрдВ рдЕрдкрдиреЗ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЯреВрд▓ s3tmpgen рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░ рд╕рдХрддрд╛

рд╡реИрд╕реЗ рднреА, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рд╕реАрдПрд▓рдЖрдИ рдореЗрдВ рдРрд╕реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЖрдордВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рдПрд╕ 3 рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рджреИрдирд┐рдХ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдпрд╡рд╛рди рдЙрдкрдХрд░рдг рдмрди рдЧрдпрд╛ред

+1

+1

рдореИрдВ рд╣реЗрд░реЛрдХреВ рдореЗрдВ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдмрдВрдбрд▓ рд╣реЛрд╕реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд╕ 3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдПрдХ рд╢рд╛рдирджрд╛рд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдЧреА :)

https://blog.heroku.com/archives/2014/5/22/introducing_the_app_json_application_manifest

+1

+1 рдЗрд╕реЗ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рд╕реАрдПрд▓рдЖрдИ рдореЗрдВ рд░рдЦрдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛

рдпрд╣рд╛рдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдмрд╕ рдПрдХ рдиреЛрдЯ, рдЖрдк boto рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдкрд╣реБрдВрдЪрдХрд░ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: https://boto.readthedocs.org/en/latest/ref/s3.html#boto .s3.key.Key.generate_url

рдкреНрд░рддрд┐рдкреБрд╖реНрдЯрд┐ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдЗрд╕реЗ рджреЗрдЦ рд▓реВрдВрдЧрд╛, рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рд╕реАрдПрд▓рдЖрдИ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рд╢рд╛рдирджрд╛рд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реЛрдЧреАред

рдзрдиреНрдпрд╡рд╛рдж, @johnboxallред рдмреЛрдЯреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореВрд▓ рдкрд╛рдпрдерди рдкрд░рд┐рдирд┐рдпреЛрдЬрди (рд╡рд┐рдВрдбреЛрдЬ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ) рдХреЗ рдмрд┐рдирд╛ рдХреНрд▓реА рдмрд╛рдЗрдирд░реА рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдЙрд╕ рдорд╛рд░реНрдЧ рдкрд░ рдЬрд╛рдирд╛ рдкрд╛рд╡рд░рд╢реЗрд▓ рдПрд╕рдбреАрдХреЗ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдФрд░ .NET рдПрд╕рдбреАрдХреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реА рдХрд╛рдо рд╣реИред рдЕрднреА рднреА рдЗрд╕ рдореВрд▓ рдирд┐рд╡рд╛рд╕реА рдХреЛ рд╕реАрдПрд▓рдЖрдИ рдореЗрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдореБрд╕реНрдХрд░рд╛рд╣рдЯ:

рдмрд╕ рдЕрдм рддрдХ рд╕реАрдзреЗ рдмреЛрдЯреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЬрдм рддрдХ рдЗрд╕реЗ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕-рдХреНрд▓реА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдореИрдВ рдПрдХ рддреНрд╡рд░рд┐рдд рдирдореВрдирд╛ рдирд┐рд░реНрджреЗрд╢ рдЬреЛрдбрд╝реВрдВрдЧрд╛ред рдореИрдВ рдЕрдм рдЗрд╕реЗ рджреЛ рдмрд╛рд░ рдвреВрдВрдв рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рдЯрд┐рдХрдЯ рдФрд░ @johnboxall рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд

рдПрдХ рдмреЙрдХреНрд╕ рдкрд░ рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдЬрдЧрд░ рд╕реНрдерд╛рдкрд┐рдд рд╣реИ

$ 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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ url рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ (рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде -http ) рднреА httpред

рдЕрднреА рднреА рдЗрд╕реЗ awscli рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред

:+1:

рдХреНрд▓рд┐ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирдиреЗ рдХреЗ рд▓рд┐рдП s3 рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд url рдХреЗ рд▓рд┐рдП +1

:+1:

+1

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдЗрд╕рдореЗрдВ рдЗрддрдирд╛ рд╕рдордп рдХреНрдпреЛрдВ рд▓рдЧрддрд╛ рд╣реИ: рдЪреАрдЬреЗрдВ рдХреНрд░рдо рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд░реЛрдбрдореИрдк рдкрд░ рд╣реИред

рдЪреВрдВрдХрд┐ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рд╕реАрдПрд▓рдЖрдИ botocore рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ,

рдкреБрд▓ рдЕрдиреБрд░реЛрдз boto/botocore#504 рдХреЛ рдкрд╣рд▓реЗ рд╣реА рд╢рд╛рдЦрд╛ clients-only рдореЗрдВ рд╡рд┐рд▓рдп рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд░реЛрдбрдореИрдк (https://github.com/boto/botocore рдкрд░ README рдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд) рдХрд╛ рджрд╛рд╡рд╛ рд╣реИ, botocore рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╢рд╛рдЦрд╛ clients-only рд╡рд┐рд▓рдп рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рд┐рд░реНрдл рдПрдХ рдХрджрдо рд╣реИред

@vlcinsky

рд╣рд╛рдВ, рдПрдХ рдмрд╛рд░ рдЬрдм рдЧреНрд░рд╛рд╣рдХ-рдХреЗрд╡рд▓ рд╢рд╛рдЦрд╛ рдмреЛрдЯреЛрдХреЛрд░ рдореЗрдВ рд╡рд┐рд▓рдп рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╣рдо рд╕реАрдПрд▓рдЖрдИ рдореЗрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдпреВрдЖрд░рдПрд▓ рдХреА рдкреАрдврд╝реА рдХреЛ рд▓реЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗред рдлрд┐рд░, рд╕реАрдПрд▓рдЖрдИ рдкрдХреНрд╖ рдкрд░ рдЬреЛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд╡рд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдПрдкреАрдЖрдИ рдмрдирд╛рдирд╛ рд╣реИ рдЬреЛ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИред

:+1: рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЖрд╕рд╛рди рд╕реБрд╡рд┐рдзрд╛ рд╣реЛрдЧреА

+1

рдЬреИрд╕рд╛ рдХрд┐ @kyleknap рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдПрдкреАрдЖрдИ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдирд╛ рд╣реИред

рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рджреЗрдЦрддрд╛ рд╣реВрдВ:

  • "tmpGET": GET рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП tmpurl рдмрдирд╛рдПрдВ
  • "tmpPOST": POST рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП tmpurl рдмрдирд╛рдПрдВ
  • "tmp???": рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ? рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ (рдФрд░ рдХрднреА рднреА рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ)
    рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдкреЛрд╕реНрдЯ рдХрд░реЗрдВ)

"TmpGET" рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдЖрдЙрдЯрдкреБрдЯ url рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдЗрдирдкреБрдЯ рдмрдХреЗрдЯ/рдХреБрдВрдЬреА рдФрд░ рд╕рдорд╛рдкреНрддрд┐ рд╣реИ
рджрд┐рдирд╛рдВрдХ (рд╕рдорд╛рдкреНрддрд┐ рд╕рдордп)ред

"TmpPOST" рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рдХреЛ рдкреЛрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдиреАрддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред

рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╢реНрди рдпрд╣ рд╣реИ рдХрд┐ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд╣рд╛рдВ рд░рдЦрд╛ рдЬрд╛рдП, рджреЛ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ:

  • aws s3
  • aws s3api

рдореИрдВ рдЖрдЬ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ "tmpPOST" рд╕реЗ рдирд╣реАрдВ рдирд┐рдкрдЯреВрдВрдЧрд╛ рдФрд░ рд╕рд░рд▓ "tmpGET" рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛

рддреНрд╡рд░рд┐рдд рд╕рдорд╛рдзрд╛рди: aws s3 tmpurl

рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛, рдЗрд╕рд╕реЗ 80% рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреА
рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ AWS S3 рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВ рдФрд░ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдерд╛рдпреА url рдкреНрд░рджрд╛рди рдХрд░реЗрдВ
рдХрд┐рд╕реА рдХ рд╕рд╛рде)ред

рдЕрд╡рдзрд╛рд░рдгрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдВрддрд░реЛрдВ рдХреЗ рд╕рд╛рде рдореМрдЬреВрджрд╛ aws s3 ls рдкрд░ рдирд┐рд░реНрдорд┐рдд рд╣реЛрдЧреА:

  • рдЙрд╕ рджрд┐рдирд╛рдВрдХ рдФрд░ рд╕рдордп рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк --expires рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рд╕ рдкрд░ url рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдпрд╛ --expires-in
    рд╕рдорд╛рдкреНрддрд┐ рддрдХ рд╕реЗрдХрдВрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ
  • рдХреЗрд╡рд▓ tmpurls рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдЧрд╛, рдкреНрд░рддрд┐ рд╕реВрдЪреАрдмрджреНрдз рд╡рд╕реНрддреБ рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐

рдореБрдЭреЗ рдбрд░ рд╣реИ, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕рдЯреАрдХ рд╕рдордп рдХреЗ рд▓рд┐рдП tmp url рдмрдирд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрд░рдВрднрд┐рдХ
рд╕рдВрд╕реНрдХрд░рдг 3600 рд╕реЗрдХрдВрдб рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ --expires-in рд╡рд┐рдХрд▓реНрдк рдХреА рдкреЗрд╢рдХрд╢ рдХрд░реЗрдЧрд╛ред

рдлрд╛рдпрджрд╛ рдФрд░ рдиреБрдХрд╕рд╛рди

рдкреЗрд╢реЗрд╡рд░реЛрдВ

рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рдПрд╕ 3 рдкрд░ рдореМрдЬреВрджрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЯреАрдПрдордкреА рдпреВрдЖрд░рдПрд▓ рдХрд╛ рдЧреБрдЪреНрдЫрд╛ рдмрдирд╛рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдпрд╣ рдмрдЪрд╛рддрд╛ рд╣реИ
рд╕рдЯреАрдХ рдмрд╛рд▓реНрдЯреА/рдХреБрдВрдЬреА рдирд╛рдо рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдмрд╛рдзрд╛ред

рджреЛрд╖

рдЗрд╕ aws s3 ls рдЖрдзрд╛рд░рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдХреЛрдИ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП tmp url рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ
рдЕрднреА рддрдХ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред

рд╡реИрд╕реЗ рднреА, рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ aws s3api рд╕рдорд╛рдзрд╛рди рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд╕реЗ рд╡рд╣рд╛рдБ рд░рдЦрд╛ рд╣реИред рдЬрдмрдХрд┐ рдПрдХ рдкреЛрд╕реНрдЯ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рд▓рдЧрднрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рдХреБрдЫ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдкреНрд░рд╛рдкреНрдд рд╡рд┐рдзрд┐ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдЖрдорддреМрд░ рдкрд░ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реЛрддреЗ рд╣реИрдВред рдЬрдм рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддреЛ рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВред

рдореИрдВ рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЕрд╕реНрдерд╛рдпреА рдпреВрдЖрд░рдПрд▓ рдХреЛ рдПрд╕ 3 рдкрд░ рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд▓реЗрдирд╛ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд░ рдХреЛрдИ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдпреВрдЖрд░рдПрд▓ рдХреЗ рдкреВрд░реЗ рд╕реЗрдЯ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рддрд░реНрдХ рд╣реИ рдХрд┐ рдХреНрд▓реА рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ tmpurl рдЖрджрд┐рдо рдиреНрдпреВрдирддрдо рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдЙрддреНрдкрд╛рдж рд╣реИред

рдореИрдВрдиреЗ рдЕрдкрдиреА рд╕реНрдерд╛рдиреАрдп рд╢рд╛рдЦрд╛ рдореЗрдВ s3 рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡-рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд URL рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ (рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ)ред

https://github.com/quiver/aws-cli/tree/s3-presigned-url

рдпрд╣ botocore.generate_presigned_url рд▓рд┐рдП рдПрдХ рдкрддрд▓рд╛-рдЖрд╡рд░рдг рд╣реИ, рдФрд░ рдпрд╣ рдЕрднреА рддрдХ рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ @vlcinsky рдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рд╣рдореЗрдВ AWSCLI рд░реВрдк рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреЗ API рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рдпрд╣ рддрдп рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

рдПрдХ рдмрд╛рдд рдЬреЛ рдореИрдВрдиреЗ рдиреЛрдЯ рдХреА рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ generate_presigned_url рд▓рд┐рдП client_method рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП S3 API (рдЬреИрд╕реЗ get_object ) рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рдореЗрд░реЗ рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рдВрдкрд░реНрдХ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реЛрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдЬреИрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдЙрдк-рдЖрджреЗрд╢ рдкреНрд░рджрд╛рди рдХрд░рдирд╛( aws s3 geturl , aws s3 uploadurl ) рдпрд╛ рд╕реНрд╡рд┐рдЪ рд╡рд┐рдХрд▓реНрдк ( --type upload )

рдкреНрд░рдпреЛрдЧ

S3 . рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ

$ 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

S3 . рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

$ 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://.s3.amazonaws.com/dir/dir/file

рдЬрдм рдореИрдВ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХрд░реНрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ SSL рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕рдорд╕реНрдпрд╛ рдорд┐рд▓рддреА рд╣реИ: рдЕрдорд╛рдиреНрдп рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛
рдЕрдЧрд░ рдореИрдВ рд╡рд┐рдХрд▓реНрдк -k рдХреЗ рд╕рд╛рде рдХрд░реНрд▓ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдкрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рднреА рдкрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдпреВрдЖрд░рдПрд▓ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ: ' https://s3-.amazonaws.com//рдбреАрдЖрдИрдЖрд░/рдбреАрдЖрдИрдЖрд░/рдлрд╛рдЗрд▓'
рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдорд╛рдиреНрдп рд╣реИ, рдХреНрдпрд╛ рдпреВрдЖрд░рдПрд▓ рдмрджрд▓рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ, рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рдлрд┐рдХреНрд╕ рд╣реИ?
рдзрдиреНрдпрд╡рд╛рдж,
рдЧреИрд░реА

рдЙрджрд╛рд╣рд░рдг: ' https://s3-us-west-1.amazonaws.com/bucket/dir/dir/file '

рдЕрджреНрдпрддрди, boto3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд url рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред

+1

рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА - 3 рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕реАрдПрд▓рдЖрдИ рдЙрдкрдХрд░рдг рдХреЛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдпреВрдЖрд░рдПрд▓ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдирд╣реАрдВ рдорд┐рд▓рд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ boto рдФрд░

1+

+1

+1

рдЗрд╕ рдкрд░ рдХрд┐рд╕реА рднреА рдЕрджреНрдпрддрди? рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдпрд╣ рдЕрднреА рддрдХ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред

+1

рдореИрдВрдиреЗ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд▓рд┐рдЦрд╛ рдФрд░ рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдХрд┐рдпрд╛: https://github.com/gdbtek/aws-tools

рд╣рд╛рдп рд╕рдм, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдмреИрдХрд▓реЙрдЧ рдкрд░ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рд╕рдЯреАрдХ рддрд┐рдерд┐рдпрд╛рдВ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реВрдВрдЧрд╛ред

рдорд╣рд╛рди! рдереИрдВрдХреНрд╕!

рдХреНрдпрд╛ рдПрдХ рд╕рдВрдкреВрд░реНрдг рдПрд╕ 3 рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдпреВрдЖрд░рдПрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ? рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рд╣рд┐рдд?

@tommeda рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред рдкреВрд░реНрд╡-рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдпреВрдЖрд░рдПрд▓ рд╣рдореЗрд╢рд╛ рдПрдХрд▓ рд╕рдВрдЧреНрд░рд╣реАрдд рд╡рд╕реНрддреБ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЖрдк рдЬрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рд╕реНрдерд┐рд░ рд╡реЗрдм рд╕рд╛рдЗрдЯ рдХреЗ рд╕рдорд╛рди рд╣реИ рд▓реЗрдХрд┐рди рдЙрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдпрджрд┐ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рдПрд╕ 3 рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ), рдХрд┐рд╕реА рдХреЛ рдХреБрдЫ рдкреНрд░реЙрдХреНрд╕реА рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдХреБрдЫ рдкреНрд░рдпрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИрдВ, рдореБрдЭреЗ рдХреЛрдИ рднреА рдЖрд╕рд╛рди рдирд╣реАрдВ рд▓рдЧрд╛ (рд▓рдЧрднрдЧ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд╢реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛)ред

рдЖрдк рд╣рдореЗрд╢рд╛ рдПрдХ рд╡реЗрдмрдкреЗрдЬ рдЬреЗрдирд░реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреВрд░реНрд╡ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдпреВрдЖрд░рдПрд▓ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдПрд╕ 3 рдореЗрдВ рдбрд╛рд▓ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рдПрдХ рдкреВрд░реНрд╡ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдпреВрдЖрд░рдПрд▓ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддрд╛ рд╣реИред рдмрд┐рд▓реНрдХреБрд▓ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдЧрд╛

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

kangman picture kangman  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ypant picture ypant  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ehammond picture ehammond  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

hapx101 picture hapx101  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

alexejk picture alexejk  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ