ããã¯ããªã«ãããããŠæžãããã®ïŒ
LocalStackãMinIOãAmazon S3äºæã®ãªããžã§ã¯ãã¹ãã¬ãŒãžãšããŠAWS SDKãAWS CLIããã¢ã¯ã»ã¹ããããšã¯ããããã®ã§ããã
ãã±ããã«ã¢ããããŒããããã¡ã€ã«ãHTTPã§åç
§ããããšã£ãŠãªããªããšãµãšæããŸããŠã
ããããæãã§ãWebãµãŒããŒçã«äœ¿ããããšãã話ã§ããã
Amazon S3 を使用して静的ウェブサイトをホスティングする - Amazon Simple Storage Service
調ã¹ããã§ãããã ã£ãã®ã§ãã¡ãã£ãšè©ŠããŠã¿ãŸããã
ç°å¢
ä»åã®ç°å¢ã¯ããã¡ãã
LocalStackã
$ python3 -V Python 3.10.6 $ localstack --version 1.3.1
èµ·åã
$ localstack start
MinIOãµãŒããŒã
$ minio --version minio version RELEASE.2023-01-25T00-19-54Z (commit-id=50d58e9b2dbbfbe2f3afa2c16ae701f9c1cf03ec) Runtime: go1.19.4 linux/amd64 License: GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html> Copyright: 2015-2023 MinIO, Inc.
èµ·åã
$ minio server /var/lib/minio/data --console-address :9001
MinIOã®CLIã
$ mcli --version mcli version RELEASE.2023-01-11T03-14-16Z (commit-id=14c2e506fa78b53fb6db88bcf87d8f6d3fb6989e) Runtime: go1.19.4 linux/amd64 Copyright (c) 2015-2023 MinIO, Inc. License GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html>
MinIOã®CLIããã¢ã¯ã»ã¹ããæã¯ãmyminio
ãšãšã€ãªã¢ã¹ããŠãããŸãããŠãŒã¶ãŒåãšãã¹ã¯ãŒãã¯minioadmin
ïŒminioadmin
ã§ãã
$ mcli alias set myminio http://localhost:9000 minioadmin minioadmin
$ aws --version aws-cli/2.9.18 Python/3.9.11 Linux/5.15.0-58-generic exe/x86_64.ubuntu.22 prompt/off
ã¯ã¬ãã³ã·ã£ã«ã¯ãç°å¢å€æ°ã§æå®ããããšã«ããŸãã
$ export AWS_ACCESS_KEY_ID=minioadmin $ export AWS_SECRET_ACCESS_KEY=minioadmin $ export AWS_DEFAULT_REGION=ap-northeast-1
LocalStackã®å Žåã¯ã¢ã¯ã»ã¹ããŒIDãšã·ãŒã¯ã¬ããã¢ã¯ã»ã¹ããŒã®å€ã¯ãªãã§ãããã®ã§ãããåããã®ã䜿ãããšã«ããŸãã
â»LocalStackçšã®AWS CLIã¯ãä»åã¯å€ããŠãããŸã
ãã±ããã«ã¢ããããŒããããã¡ã€ã«ãã誰ãããåç §å¯èœã«ãã
LocalStackïŒAWS CLIã§è©Šã
ãŸãã¯ãLocalStackAWS CLIã§æäœããŠã¿ãŸãããã
ãã±ããäœæãLocalStackãããŒã«ã«ã§èµ·åããŠããã®ã§ããšã³ããã€ã³ãã¯http://localhost:4566
ã§ãã
$ aws --endpoint-url http://localhost:4566 s3 mb s3://public-bucket make_bucket: public-bucket
é©åœã«ãã¢ããããŒããããã¡ã€ã«ãçšæããŸãã
$ echo 'Hello Storage!!' > hello.txt $ curl -LO https://tomcat.apache.org/res/images/tomcat.png $ curl -LO https://dlcdn.apache.org/tomcat/tomcat-10/v10.0.27/bin/apache-tomcat-10.0.27.tar.gz
ã¢ããããŒãã
$ aws --endpoint-url http://localhost:4566 s3 cp ./hello.txt s3://public-bucket/hello.txt upload: ./hello.txt to s3://public-bucket/hello.txt $ aws --endpoint-url http://localhost:4566 s3 cp ./tomcat.png s3://public-bucket/images/tomcat.png upload: ./tomcat.png to s3://public-bucket/images/tomcat.png $ aws --endpoint-url http://localhost:4566 s3 cp ./apache-tomcat-10.0.27.tar.gz s3://public-bucket/archives/apache-tomcat-10.0.27.tar.gz upload: ./apache-tomcat-10.0.27.tar.gz to s3://public-bucket/archives/apache-tomcat-10.0.27.tar.gz
ãããã®ãªããžã§ã¯ãã«å¯ŸããŠãhttp://[LocalStackã®ã¢ãã¬ã¹]:[LocalStackã®ããŒã]/[ãã±ããå]/[ããŒ]
ã§ã¢ã¯ã»ã¹ã§ããããã§ãã
$ curl localhost:4566/public-bucket/hello.txt Hello Storage!!
ç¹ã«ãªã«ãèšå®ã¯èŠããªãã£ãã®ã§é©ããŸããâŠã
Content-Type
ãªã©ã¯ã©ããªã£ãŠãããã§ããããïŒ
$ curl -I localhost:4566/public-bucket/hello.txt HTTP/1.1 200 content-type: text/plain Content-Length: 16 Server: Werkzeug/2.1.2 Python/3.10.8 Date: Thu, 26 Jan 2023 06:22:40 GMT content-md5: W+wurJXnAgnol21+VbZXOg== ETag: "5bec2eac95e70209e8976d7e55b6573a" last-modified: Thu, 26 Jan 2023 06:19:38 GMT x-amzn-requestid: 2JkUKhj1v9ZqSoMks0lPZllR58tUG2u4SHUECYD4Y0xzGYCgVL3B Connection: close Access-Control-Allow-Origin: * Access-Control-Allow-Methods: HEAD,GET,PUT,POST,DELETE,OPTIONS,PATCH Access-Control-Allow-Headers: authorization,cache-control,content-length,content-md5,content-type,etag,location,x-amz-acl,x-amz-content-sha256,x-amz-date,x-amz-request-id,x-amz-security-token,x-amz-tagging,x-amz-target,x-amz-user-agent,x-amz-version-id,x-amzn-requestid,x-localstack-target,amz-sdk-invocation-id,amz-sdk-request Access-Control-Expose-Headers: etag,x-amz-version-id x-amz-request-id: 5F70896B07057A95 x-amz-id-2: MzRISOwyjmnup5F70896B07057A957/JypPGXLh0OVFGcJaaO3KW/hRAqKOpIEEp date: Thu, 26 Jan 2023 06:22:40 GMT server: hypercorn-h11 $ curl -I localhost:4566/public-bucket/images/tomcat.png HTTP/1.1 200 content-type: image/png Content-Length: 8410 Server: Werkzeug/2.1.2 Python/3.10.8 Date: Thu, 26 Jan 2023 06:23:06 GMT content-md5: QVzVnSsAbnlbn5nFW4PX7A== ETag: "415cd59d2b006e795b9f99c55b83d7ec" last-modified: Thu, 26 Jan 2023 06:19:45 GMT x-amzn-requestid: sgohQAVCccKR1Dz3ZEg3oSj5stKqYBoD7rpiMF8NGWbsnMIB0l7w Connection: close Access-Control-Allow-Origin: * Access-Control-Allow-Methods: HEAD,GET,PUT,POST,DELETE,OPTIONS,PATCH Access-Control-Allow-Headers: authorization,cache-control,content-length,content-md5,content-type,etag,location,x-amz-acl,x-amz-content-sha256,x-amz-date,x-amz-request-id,x-amz-security-token,x-amz-tagging,x-amz-target,x-amz-user-agent,x-amz-version-id,x-amzn-requestid,x-localstack-target,amz-sdk-invocation-id,amz-sdk-request Access-Control-Expose-Headers: etag,x-amz-version-id x-amz-request-id: B96A1E2F60DCC523 x-amz-id-2: MzRISOwyjmnupB96A1E2F60DCC5237/JypPGXLh0OVFGcJaaO3KW/hRAqKOpIEEp date: Thu, 26 Jan 2023 06:23:06 GMT server: hypercorn-h11 $ curl -I localhost:4566/public-bucket/archives/apache-tomcat-10.0.27.tar.gz HTTP/1.1 200 content-type: application/x-tar Content-Length: 11984522 Server: Werkzeug/2.1.2 Python/3.10.8 Date: Thu, 26 Jan 2023 06:23:22 GMT ETag: "b1b0a5be661bb2e3d5e29dbf9daa4db7-2" last-modified: Thu, 26 Jan 2023 06:19:49 GMT x-amzn-requestid: H8pQahqIcVroyKEg9v1YdlB86oYWwzBNg30Xv3jiSTlx1qCBY77w Connection: close Access-Control-Allow-Origin: * Access-Control-Allow-Methods: HEAD,GET,PUT,POST,DELETE,OPTIONS,PATCH Access-Control-Allow-Headers: authorization,cache-control,content-length,content-md5,content-type,etag,location,x-amz-acl,x-amz-content-sha256,x-amz-date,x-amz-request-id,x-amz-security-token,x-amz-tagging,x-amz-target,x-amz-user-agent,x-amz-version-id,x-amzn-requestid,x-localstack-target,amz-sdk-invocation-id,amz-sdk-request Access-Control-Expose-Headers: etag,x-amz-version-id x-amz-request-id: 7B8DD387A5E98F06 x-amz-id-2: MzRISOwyjmnup7B8DD387A5E98F067/JypPGXLh0OVFGcJaaO3KW/hRAqKOpIEEp date: Thu, 26 Jan 2023 06:23:22 GMT server: hypercorn-h11
ã¡ãããšèšå®ãããŠãããã§ãããããã¯Content-Type
ãæªæå®ã®å Žåã«AWS CLIãšãããPythonãæšæž¬ãããã®ã®ããã§ãã
https://github.com/aws/aws-cli/blob/2.9.18/awscli/customizations/s3/utils.py#L330-L336
mimetypes --- ファイル名を MIME 型へマップする — Python 3.9.12 ドキュメント
ãªãã»ã©ã
$ python3 Python 3.10.6 (main, Nov 14 2022, 16:10:14) [GCC 11.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import mimetypes >>> mimetypes.guess_type('hoge.png') ('image/png', None) >>> mimetypes.guess_type('hoge.tar.gz') ('application/x-tar', 'gzip') >>> mimetypes.guess_type('hoge.txt') ('text/plain', None)
ãŸããAWS CLIãªã©ã§ã¢ããããŒãããéã«ãContent-Type
ïŒå¿
èŠã«å¿ããŠContent-Encoding
ãïŒãèšå®ããã®ãè¯ããããªæ°ã¯ããŸãã
$ aws --endpoint-url http://localhost:4566 s3 cp ./hello.txt s3://public-bucket/hello.txt --content-type 'text/plain' $ aws --endpoint-url http://localhost:4566 s3 cp ./tomcat.png s3://public-bucket/images/tomcat.png --content-type 'image/png' $ aws --endpoint-url http://localhost:4566 s3 cp ./apache-tomcat-10.0.27.tar.gz s3://public-bucket/archives/apache-tomcat-10.0.27.tar.gz --content-encoding 'gzip' --content-type 'application/x-gzip'
ããã§ãContent-Type
ãContent-Encoding
ã«åæ ãããŸãã
$ curl -I localhost:4566/public-bucket/archives/apache-tomcat-10.0.27.tar.gz HTTP/1.1 200 content-type: application/x-gzip Content-Length: 11984522 Server: Werkzeug/2.1.2 Python/3.10.8 Date: Thu, 26 Jan 2023 06:24:08 GMT content-encoding: gzip ETag: "b1b0a5be661bb2e3d5e29dbf9daa4db7-2" last-modified: Thu, 26 Jan 2023 06:24:03 GMT x-amzn-requestid: xNqrIvUIPXDQMuvH2IeF6NMvPrT6kzjBVpB3qQCgtjE4OWsYOnUl Connection: close Access-Control-Allow-Origin: * Access-Control-Allow-Methods: HEAD,GET,PUT,POST,DELETE,OPTIONS,PATCH Access-Control-Allow-Headers: authorization,cache-control,content-length,content-md5,content-type,etag,location,x-amz-acl,x-amz-content-sha256,x-amz-date,x-amz-request-id,x-amz-security-token,x-amz-tagging,x-amz-target,x-amz-user-agent,x-amz-version-id,x-amzn-requestid,x-localstack-target,amz-sdk-invocation-id,amz-sdk-request Access-Control-Expose-Headers: etag,x-amz-version-id x-amz-request-id: 3A824132B0C81C38 x-amz-id-2: MzRISOwyjmnup3A824132B0C81C387/JypPGXLh0OVFGcJaaO3KW/hRAqKOpIEEp date: Thu, 26 Jan 2023 06:24:08 GMT server: hypercorn-h11
MinIOïŒAWS CLIã§è©Šã
次ã¯ãMinIOïŒAWS CLIã§è©ŠããŠã¿ãŸãããã
MinIOãããŒã«ã«ã§èµ·åããŠããã®ã§ããšã³ããã€ã³ãã¯http://localhost:9000
ã§ãã
ãã±ããäœæã
$ aws --endpoint-url http://localhost:9000 s3 mb s3://public-bucket make_bucket: public-bucket
ãã¡ã€ã«ãã¢ããããŒãã
$ aws --endpoint-url http://localhost:9000 s3 cp ./hello.txt s3://public-bucket/hello.txt --content-type 'text/plain' $ aws --endpoint-url http://localhost:9000 s3 cp ./tomcat.png s3://public-bucket/images/tomcat.png --content-type 'image/png' $ aws --endpoint-url http://localhost:9000 s3 cp ./apache-tomcat-10.0.27.tar.gz s3://public-bucket/archives/apache-tomcat-10.0.27.tar.gz --content-encoding 'gzip' --content-type 'application/x-gzip'
LocalStackãšåãããã«http://[MinIOã®ã¢ãã¬ã¹]:[MinIOã®ããŒã]/[ãã±ããå]/[ããŒ]
ã§ã¢ã¯ã»ã¹ã§ãããšæããããã¢ã¯ã»ã¹æåŠãããŸãã
$ curl localhost:9000/public-bucket/hello.txt <?xml version="1.0" encoding="UTF-8"?> <Error><Code>AccessDenied</Code><Message>Access Denied.</Message><Key>hello.txt</Key><BucketName>public-bucket</BucketName><Resource>/public-bucket/hello.txt</Resource><RequestId>173DC7EFA397313E</RequestId><HostId>0d54e0c2-1fda-463c-a355-f9b30c0a2c9e</HostId></Error>
ããã§ã以äžã®ããã«äœæãããã±ããã«å¯ŸããŠèª°ãã¢ã¯ã»ã¹ã§ãããããªããªã·ãŒãäœæããŸãã
bucket-policy.json
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action": [ "s3:GetBucketLocation", "s3:ListBucket" ], "Resource":"arn:aws:s3:::public-bucket", "Principal": { "AWS": "*" } }, { "Effect":"Allow", "Action": "s3:GetObject", "Resource":"arn:aws:s3:::public-bucket/*", "Principal": { "AWS": "*" } } ] }
é©çšã
$ aws --endpoint-url http://localhost:9000 s3api put-bucket-policy --bucket public-bucket --policy file://bucket-policy.json
ããã§ãã¢ã¯ã»ã¹å¯èœã«ãªããŸãã
$ curl localhost:9000/public-bucket/hello.txt Hello Storage!!
MinIOïŒMinIO CLIã§è©Šã
MinIOã®å Žåã¯ãCLIãããã®ã§ãã¡ãã§ã確èªããŠãããŸãããã
ãšãã£ãŠããæš©éèšå®ã®è©±ãäžå¿ã«ããŠãããŸãã
anonymous set
ã§ãèªèšŒãããŠããªããŠãŒã¶ãŒã«å¯Ÿããæ¯ãèããæå®ã§ããŸãã
mc anonymous set — MinIO Object Storage for Linux
none
ãdownload
ãupload
ãpublic
ã§ç°¡æçã«ããªã·ãŒãèšå®ã§ããdownload
ã§ã¯èª°ã§ãããŠã³ããŒããå¯èœã«ãªãããªã·ãŒã§ãã
ä»åã¯download
ã䜿ããŸãã
ãã±ããäœæã
$ mcli mb myminio/public-bucket Bucket created successfully `myminio/public-bucket`.
誰ãããããŠã³ããŒãã§ããããã«èšå®ã
$ mcli anonymous set download myminio/public-bucket
ããã§ãã¢ããããŒããããã¡ã€ã«ã誰ã§ãåç
§ã§ããããã«ãªããŸãã
â»ãã¡ã€ã«ã®ã¢ããããŒãã¯çç¥ããŠããŸã
$ curl localhost:9000/public-bucket/hello.txt Hello Storage!!
ã¡ãªã¿ã«ããã®æã®ãã±ããããªã·ãŒãã©ããªã£ãŠããããšãããšããã®ããã«ãªã£ãŠããŸãã
$ aws --endpoint-url http://localhost:9000 s3api get-bucket-policy --bucket public-bucket { "Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetBucketLocation\",\"s3:ListBucket\"],\"Resource\":[\"arn:aws:s3:::public-bucket\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:GetObject\"],\"Resource\":[\"arn:aws:s3:::public-bucket/*\"]}]}" }
æååããJSONã«ããŠããã©ãŒããããããšããã§ããã
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "*" ] }, "Action": [ "s3:GetBucketLocation", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::public-bucket" ] }, { "Effect": "Allow", "Principal": { "AWS": [ "*" ] }, "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::public-bucket/*" ] } ] }
ã€ãŸãMinIOïŒAWS CLIã®äŸã§é©çšããŠãããã±ããããªã·ãŒã¯ããããšåããã®ã ã£ãããšããããšã«ãªããŸãã
ãã±ããã«ã¢ããããŒããããã¡ã€ã«ããèªèšŒæ å ±ä»ãã§ã¢ã¯ã»ã¹ãã
LocalStackã¯ãããªãèªèšŒæ å ±ãªãã§ã¢ã¯ã»ã¹ã§ããã®ã§ãMinIOéå®ã®è©±ã«ãªããŸããã
èªèšŒæ å ±ãä»äžããŠHTTPã¢ã¯ã»ã¹ã§ããªããã®ã§ããããïŒ
ãã±ãããäœæããŠããã¡ã€ã«ãã¢ããããŒãã
$ aws --endpoint-url http://localhost:9000 s3 mb s3://private-bucket $ aws --endpoint-url http://localhost:9000 s3 cp ./hello.txt s3://private-bucket/hello.txt
ãã®ç¶æ ã«ãªãã®ãããã±ããããªã·ãŒãå€æŽããã«ãªããšãããããšãã話ã§ãã
$ curl localhost:9000/private-bucket/hello.txt <?xml version="1.0" encoding="UTF-8"?> <Error><Code>AccessDenied</Code><Message>Access Denied.</Message><Key>hello.txt</Key><BucketName>private-bucket</BucketName><Resource>/private-bucket/hello.txt</Resource><RequestId>173DC99B32B3BBD0</RequestId><HostId>11bf943b-4421-48df-ad00-a604a07470d6</HostId></Error>
ã©ããããAWSã®ããŒãžã§ã³4ã®çœ²åãä»ããã°è¯ãããã§ã¯ãããŸãã
AWS API リクエスト署名の要素 - AWS 全般のリファレンス
ãŸããcurl 7.75ã§--aws-sigv4
ãšãããªãã·ã§ã³ãè¿œå ãããŠããããã¡ãã䜿ãã°è¯ãããã§ãã
--aws-sigv4
ã«ã¯aws:amz:[ãªãŒãžã§ã³]:[ãµãŒãã¹å]
ãæå®ããŸããaws:amz
ã¯åºå®ã§ãã
ãŸãã--user
ã«ã¯ã¢ã¯ã»ã¹ããŒIDãšã·ãŒã¯ã¬ããã¢ã¯ã»ã¹ããŒããŠãŒã¶ãŒåãšãã¹ã¯ãŒããšããŠæå®ããŸãã
$ curl --aws-sigv4 'aws:amz:ap-northeast-1:s3' --user 'minioadmin:minioadmin' localhost:9000/private-bucket/hello.txt <?xml version="1.0" encoding="UTF-8"?> <Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><Key>hello.txt</Key><BucketName>private-bucket</BucketName><Resource>/private-bucket/hello.txt</Resource><RequestId>173DCABFE9F561A4</RequestId><HostId>11bf943b-4421-48df-ad00-a604a07470d6</HostId></Error>
ãªã®ã§ãããããŸããããŸããâŠã
ã©ããã80ãŸãã¯443以å€ã®ããŒãããšã³ããã€ã³ãã«ãªã£ãŠãããšãåããªãããã§ãã
çŸæç¹ã§ã®ã¯ãŒã¯ã¢ã©ãŠã³ããšããŠã¯ãHost
ããããŒããããŒããå€ããšåäœããŸãã
$ curl --aws-sigv4 'aws:amz:ap-northeast-1:s3' --user 'minioadmin:minioadmin' -H 'Host: localhost' localhost:9000/private-bucket/hello.txt Hello Storage!!
curl 7.86ã§ä¿®æ£ãããŠãããããªã®ã§ããã
æå ã®curlã¯7.81ã ã£ãã®ã§âŠã
$ curl --version curl 7.81.0 (x86_64-pc-linux-gnu) libcurl/7.81.0 OpenSSL/3.0.2 zlib/1.2.11 brotli/1.0.9 zstd/1.4.8 libidn2/2.3.2 libpsl/0.21.0 (+libidn2/2.3.2) libssh/0.9.6/openssl/zlib nghttp2/1.43.0 librtmp/2.3 OpenLDAP/2.5.13 Release-Date: 2022-01-05 Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets zstd
Docker Hubã®curlã®ã€ã¡ãŒãžãããæ°ããcurlã§è©ŠããšããŸããããŸããã
$ docker container run -it --rm --name curl curlimages/curl:7.87.0 curl --aws-sigv4 'aws:amz:ap-northeast-1:s3' --user 'minioadmin:minioadmin' [ãã¹ãã®IPã¢ãã¬ã¹]:9000/private-bucket/hello.txt Hello Storage!!
ããŒãžã§ã³ã
$ docker container run -it --rm --name curl curlimages/curl:7.87.0 curl --version curl 7.87.0-DEV (x86_64-pc-linux-musl) libcurl/7.87.0-DEV OpenSSL/1.1.1s zlib/1.2.12 brotli/1.0.9 libssh2/1.10.0 nghttp2/1.47.0 Release-Date: [unreleased] Protocols: dict file ftp ftps gopher gophers http https imap imaps mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp Features: alt-svc AsynchDNS brotli HSTS HTTP2 HTTPS-proxy IPv6 Largefile libz NTLM NTLM_WB SSL threadsafe TLS-SRP UnixSockets
ãããªãšããã§ããããã
ãŸãšã
LocalStackãšMinIOã§ããã±ããã«ã¢ããããŒããããã¡ã€ã«ãHTTPã§åç §ããŠã¿ãŸããã
LocalStackã¯ãªã«ãèããã«ã¢ã¯ã»ã¹ã§ããŸããããMinIOã¯ããªã·ãŒã®èšå®ãå¿
èŠã«ã¯ãªããã®ã®ãæåŸ
ãã䜿ãæ¹ã¯ã§ãããšããããšã
ããã£ãŠè¯ãã£ãããªãšæããŸãã
ãããããcurlã®AWSã®ããŒãžã§ã³4ã®çœ²åã«é¢ãããªãã·ã§ã³ã¯ç¥ããŸããã§ããâŠã