AWS Cognitoã§ãã©ã€ããŒã S3 ãªããžã§ã¯ãã«ã¢ã¯ã»ã¹ããæ¹æ³

ã·ããªãª
顧客åãã«ããã€ãã®ã¢ããªã±ãŒã·ã§ã³ãéçºããŠãããšä»®å®ããŸãããããã ããã¢ããªã±ãŒã·ã§ã³ã®ã¬ã³ãŒãã«é¢é£ããPDFãWordãExcelãªã©ã®ãã¡ã€ã«ããããŸããã·ããªãªãç°¡ç¥åããããããããã®ãã¡ã€ã«ãAWSã®åäžã®ãã©ã€ããŒãïŒprivateïŒS3ãã±ããïŒbucketïŒã«ä¿åãããŠãããšä»®å®ããŸãã
ãŠãŒã¶ãŒã¯ãã¢ããªã±ãŒã·ã§ã³ã®URLãªã³ã¯ãéããŠãã©ã€ããŒãS3ãã±ãããããããã®é¢é£ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ã§ããå¿
èŠããããŸããç§ãã¡ã®ãœãªã¥ãŒã·ã§ã³ã¯ã瀟å
ã®ãããããœãããŠã§ã¢ã«å¯ŸããŠããŒã¿ãã«ïŒportableïŒãªãœãªã¥ãŒã·ã§ã³ãšããŠæ©èœããå¿
èŠããããŸãã
ã¯ããã«
ãã®èšäºã®ç®çã¯ãCognitoãŠãŒã¶ãŒããŒã«ïŒuser poolsïŒã䜿çšããŠãã©ã€ããŒãS3ãã±ããå
ã®ãã¡ã€ã«ãããŠã³ããŒãããæ¹æ³ã瀺ãããšã§ããCognitoã«å ããŠãCognitoãããªãŒãœã©ã€ã¶ãŒAPIGatewayãžã®ãããŒãããã³API GatewayãšLambdaã®é£æºã瀺ããŸãã
AWSã³ã³ãœãŒã«ããåã¹ãããã«ã€ããŠã§ããã ãå€ãã®ã¹ã¯ãªãŒã³ã·ã§ãããå
±æããŠããŸããç¹ã«åå¿è
åãã«ãã¹ããããããæç¢ºã«ããããã«å€ãã®ããžã¥ã¢ã«ã远å ããŠããŸãã
èæ¯
ãã®èšäºã§éçºãããå
容ãããæ·±ãçè§£ããããã«ãããã€ãã®äºåèªæžã圹ç«ã€å ŽåããããŸããç¹ã«AWSåå¿è
ã«ã¯ã以äžã®ãªã³ã¯ã圹ç«ã¡ãŸãïŒ
äœããã¹ããïŒ
ãã®ãããªã¿ã¹ã¯ã«ã¯å€ãã®ãããŒãŸãã¯æ¹æ³ãã³ãŒãã£ã³ã°ã§ããŸããããã§ã¯ã以äžã«ç€ºãæ¹æ³ãå®è£
ããŸããã·ããªãªã®å®è£
æ¹æ³ã«ã€ããŠã®ç°¡åãªèª¬æã以äžã®å³ã§ç€ºããŸãã
以äžã®å³ã¯ãCognitoãŠãŒã¶ãŒããŒã«ãS3ãã±ãããAPI Gatewayã¡ãœãããLambda颿°ãªã©ã®ããã€ãã®èŠçŽ ãäœæããå¿
èŠãããããšã瀺ããŠããŸããAWSç°å¢ã«ãã¹ãŠã®ãšã³ãã£ãã£ãäœæããåŸããããã飿ºããŠåäœã§ããããã«é©åã«æ§æããå¿
èŠããããŸãã

AWSç°å¢å
ã®ãã¹ãŠã®èŠçŽ ãéé ã§äœæããæ¹ãããã§ããããããšãã°ãLambdaãAPIã¡ãœããã§äœ¿çšããã«ã¯ãæåã«Lambda颿°ãéçºããã°ãAPI Gatewayã¡ãœããã®äœææã«ãã®é¢æ°ãç°¡åã«ãªã³ã¯ã§ããŸããåæ§ã«ãã¹ããã5ã§S3 Webãã±ãããäœæãã
callback.htmlãã¡ã€ã«ãé
眮ããå¿
èŠããããŸããããããã°ãã¹ããã6ã§CognitoãŠãŒã¶ãŒããŒã«ãäœæãããšãã«ãã®ãã¡ã€ã«ã䜿çšã§ããŸãããã¡ããããã¯å¿
é ã§ã¯ãããŸãããããã®é åºã§éçºã容æã«ãªããŸãããã®ãããããã§ã¯ãã®ã¢ãããŒãã奜ãŸããŠããŸããæŠèŠ
以äžã®è³ªåã«å¯Ÿããåçãæ¢ããŸãããã®èšäºã®ãã¹ãŠã®ã¹ããããå®è£
ããã«ã¯ãAWSã¢ã«ãŠã³ããå¿
èŠã§ããããšãå¿ããªãã§ãã ããã
- ãã©ã€ããŒãS3ãã±ããã®äœææ¹æ³
- ãã©ã€ããŒãS3ãã±ããå ã®ãªããžã§ã¯ããžã®ã¢ã¯ã»ã¹èš±å¯ã®ããã®ã«ã¹ã¿ã ããªã·ãŒã®äœææ¹æ³
- ãã©ã€ããŒãS3ãã±ããå ã®ãªããžã§ã¯ãã«ã¢ã¯ã»ã¹ããããã®Lambda颿°ã®äœææ¹æ³
- Lambda颿°ã䜿çšããããã®Gateway APIã®äœææ¹æ³
- Webãã©ã«ããšããŠäœ¿çšããããã®ãããªãã¯S3ãã±ããã®äœææ¹æ³
- CognitoãŠãŒã¶ãŒããŒã«ã®äœæãšèšå®ã®æ§ææ¹æ³
- ã·ããªãªã®ãã¹ãæ¹æ³
1. ãã©ã€ããŒãS3ãã±ããã®äœææ¹æ³
S3ã¯ãAWSã®ãªãŒãžã§ã³ããŒã¹ïŒregion-basedïŒãµãŒãã¹ã®1ã€ã§ããS3ãã±ããå
ã®ã¢ã€ãã ã¯ãªããžã§ã¯ãïŒobjectïŒãšåŒã°ããŸãããããã£ãŠãAWSå
ã®S3ãã±ããã§ã¯ãªããžã§ã¯ããšãã¡ã€ã«ãšããçšèªã¯åãæå³ã§äœ¿çšã§ããŸãã
ããã¹ãŠã®ãããªãã¯ã¢ã¯ã»ã¹ããããã¯ãïŒBlock All Public AccessïŒãã§ãã¯ããã¯ã¹ããªã³ã®ãŸãŸã«ããŠãã ãããããã«ãã©ã€ããŒãS3ãã±ãããäœæãããŠããŸããå€ãã®è¿œå æ§æãªãã·ã§ã³ããããŸããããœãªã¥ãŒã·ã§ã³ã®ç°¡ç¥åã®ããã«ããã©ã«ãå€ã§äœæããŠããŸãã

S3ãã±ãããžã®ãã©ã€ããŒãã¢ã¯ã»ã¹ããã¹ãããããã«ãããã€ãã®ãªããžã§ã¯ããã¢ããããŒãããŠãã ããããã®åŸãèš±å¯ãããŠããªããŠãŒã¶ãŒãŸãã¯å¯èœæ§ã®ããã¢ã¯ã»ã¹ãªã³ã¯ã§ãããã®ãªããžã§ã¯ãã«ã¢ã¯ã»ã¹ããŠã¿ãŠãã ãããPDFãDOCãXLSãªã©ã®ãã¡ã€ã«ãç¥ã£ãŠããŸãããAWS S3çšèªã§ã¯ããããã¹ãŠããªããžã§ã¯ããšåŒã°ããŸãã

2. ãã©ã€ããŒãS3ãã±ããå ã®ãªããžã§ã¯ããžã®ã¢ã¯ã»ã¹èš±å¯ã®ããã®ããªã·ãŒäœæ
AWSã§IAMïŒIdentity and Access ManagementïŒã¯ãã¹ãŠã®ãµãŒãã¹ã®åºç€ã§ãïŒãŠãŒã¶ãŒãã°ã«ãŒããããŒã«ãããªã·ãŒã¯ç§ãã¡ãç¥ã£ãŠããã¹ãåºæ¬æŠå¿µã§ãã
å€ãã®çµã¿èŸŒã¿ïŒbuilt-inïŒããŒã«ããããåããŒã«ã«ã¯æš©éãæå³ããå€ãã®çµã¿èŸŒã¿ããªã·ãŒããããŸãããããã¯ãAWS ManagedããšåŒã°ããŸãããã ãããCustomer ManagedãïŒã«ã¹ã¿ããŒãããŒãžãïŒããŒã«ãšããªã·ãŒãäœæããããšãå¯èœã§ãããããã£ãŠãããã«ã«ã¹ã¿ã ããªã·ãŒãäœæãããŠããŸãã
- ãã©ã€ããŒãS3ãã±ãããããªããžã§ã¯ããååŸããããã®ã«ã¹ã¿ã IAMããªã·ãŒãäœæããŠãã ããã
- AWSã®æ¢åã®ããªã·ãŒãªã¹ããèŠã€ãã以äžã«ç€ºãããã«ãã©ã€ããŒãS3ãã±ããã«å¯ŸããŠã®ã¿
GetObjectæäœãå®è¡ããæ°ããããªã·ãŒãäœæããŠãã ããïŒ

以äžã«ç€ºãããã«ã«ã¹ã¿ã ããªã·ãŒãäœæããŠãã ããããµãŒãã¹ãšããŠS3ããã¢ã¯ã·ã§ã³ïŒactionïŒãšããŠ
GetObjectã®ã¿ãéžæããŠãã ããïŒ
ãªãœãŒã¹ïŒresourceïŒãšããŠãspecificããéžæããããªã·ãŒãå¿
èŠãªæ©èœãæã€ããã«ãã©ã€ããŒãS3ãã±ãããæå®ããŠãã ããïŒ

ããªã·ãŒã«ååãä»ããŠäœæããŠãã ãããä»»æã®ååãä»ããããšãã§ããŸãããèŠããŠããå¿
èŠããããŸãã

ã«ã¹ã¿ã ããªã·ãŒã®ãµããªãŒã¯ä»¥äžã®ããã«ãªããŸãããã®JSONã³ã³ãã³ããçŽæ¥äœ¿çšããŠããªã·ãŒãäœæããããšãå¯èœã§ãïŒ

ããªã·ãŒJSONå®çŸ©ïŒ
JSON
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::private-s3-for-interfacing/*"
}
]
}
3. ãã©ã€ããŒãS3ãã±ããå ã®ãªããžã§ã¯ãã«ã¢ã¯ã»ã¹ããããã®Lambda颿°ã®äœæ
ããã§ã¯Lambda颿°ã«NodeJSã®ææ°ããŒãžã§ã³ã䜿çšãããŠããŸããLambda颿°ãäœæããŠNodeJSãéžæããŠãã ãããLambda颿°ã«ã¯PythonãGoãJavaã.NET Coreãªã©ãµããŒããããŠããä»»æã®èšèªãéžæã§ããŸãã

Lambda颿°ãäœæãããšããµã³ãã«ã®ãhelloãã³ãŒãã衚瀺ãããŸãã代ããã«ãç¬èªã®ã³ãŒããéçºããå¿
èŠããããŸãã
ã芧ã®ãšãããLambdaéçºç°å¢ã¯WebããŒã¹ã®è»œéIDEã«äŒŒãŠããŸãã

æ¢åã®ã³ãŒããäžèšã®çããµã³ãã«ã³ãŒãã«çœ®ãæããŠãã ãããã³ãŒãã®æ°ããç¶æ
ã¯ä»¥äžã®ããã«ãªããŸããã³ãŒãã倿ŽããåŸãLambda颿°ã䜿çšããããã«ãDeployããã¿ã³ãæŒããŠãã ããã
ã·ããªãªãç°¡ç¥åããããããã±ããåã¯éçã«äœ¿çšãããŠããŸãããã¡ã€ã«åã¯
fnãšããååã§ãã©ã¡ãŒã¿ãšããŠéä¿¡ãããŸããããã©ã«ãã®ã³ã³ãã³ãã¿ã€ãïŒcontent typeïŒã¯pdfãšããŠæ³å®ãããŠããŸãããLambda颿°ã³ãŒãã«å®è£
ãããŠããä»»æã®ãã¡ã€ã«ã¿ã€ãã«ããããšãã§ããŸããAPI Gatewayæ¥ç¶ã§Lambda颿°ã®ãããã·æ©èœã䜿çšããããšãéžæãããããã¬ã¹ãã³ã¹ããããŒïŒresponse headerïŒã«ã¯å¿
èŠãªè¿œå ããŒã¿ãå«ãŸããŠããŸããNodeJS Lambdaã³ãŒãïŒBlobãšããŠè¿ãïŒïŒ
JavaScript
// Lambda颿°ã³ãŒãã¯ãã®ããã«èŠããŸã
// ãã®ã³ãŒãã¯ã¬ã¹ãã³ã¹ãblobã³ã³ãã³ããšããŠè¿ããŸã
// ãã¡ã€ã«ãããŠã³ããŒãããã«ã¯ãæ·»ä»ãã¡ã€ã«ã®Callback-to-Download-Blob.htmlã䜿çšã§ããŸã
const AWS = require('aws-sdk');
const S3= new AWS.S3();
exports.handler = async (event, context) => {
let fileName;
let bucketName;
let contentType;
let fileExt;
try {
bucketName = 'private-s3-for-interfacing';
fileName = event["queryStringParameters"]['fn']
contentType = 'application/pdf';
fileExt = 'pdf';
//------------
fileExt = fileName.split('.').pop();
switch (fileExt) {
case 'pdf': contentType = 'application/pdf'; break;
case 'png': contentType = 'image/png'; break;
case 'gif': contentType = 'image/gif'; break;
case 'jpeg': case 'jpg': contentType = 'image/jpeg'; break;
case 'svg': contentType = 'image/svg+xml'; break;
case 'docx': contentType = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'; break;
case 'xlsx': contentType = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; break;
case 'pptx': contentType = 'application/vnd.openxmlformats-officedocument.presentationml.presentation'; break;
case 'doc': contentType = 'application/msword'; break;
case 'xls': contentType = 'application/vnd.ms-excel'; break;
case 'csv': contentType = 'text/csv'; break;
case 'ppt': contentType = 'application/vnd.ms-powerpoint'; break;
case 'rtf': contentType = 'application/rtf'; break;
case 'zip': contentType = 'application/zip'; break;
case 'rar': contentType = 'application/vnd.rar'; break;
case '7z': contentType = 'application/x-7z-compressed'; break;
default: ;
}
//------------
const data = await S3.getObject({Bucket: bucketName, Key: fileName}).promise();
return {
headers: {
'Content-Type': contentType,
'Content-Disposition': 'attachment; filename=' + fileName, // æåã®éµ
'Content-Encoding': 'base64',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token',
'Access-Control-Allow-Methods': 'GET,OPTIONS'
},
body: data.Body.toString('base64'),
isBase64Encoded: true,
statusCode: 200
}
} catch (err) {
return {
statusCode: err.statusCode || 400,
body: err.message || JSON.stringify(err.message) + ' - fileName: '+ fileName + ' - bucketName: ' + bucketName
}
}
}
Lambda颿°ã§ä»¥äžã«ç€ºãããã«Pythonã³ãŒãã䜿çšããããšãå¯èœã§ãïŒ
Python
# 以äžã®ã³ãŒãã¯äžèšã®NodeJSã®äŸã®ããã«éçºã§ããŸã
import base64
import boto3
import json
import random
s3 = boto3.client('s3')
def lambda_handler(event, context):
try:
fileName = event['queryStringParameters']['fn']
bucketName = 'private-s3-for-interfacing'
contentType = 'application/pdf'
response = s3.get_object(
Bucket=bucketName,
Key=fileName,
)
file = response['Body'].read()
return {
'statusCode': 200,
'headers': {
'Content-Type': contentType,
'Content-Disposition': 'attachment; filename='+ fileName,
'Content-Encoding': 'base64'
# å¿
èŠã«å¿ããŠCORSé¢é£ã®ã³ãŒããããã«è¿œå ã§ããŸã
},
'body': base64.b64encode(file).decode('utf-8'),
'isBase64Encoded': True
}
except:
return {
'headers': { 'Content-type': 'text/html' },
'statusCode': 200,
'body': 'Lambdaã§ãšã©ãŒãçºçããŸããïŒ'
}
å¥ã®æ¹æ³ãšããŠãLambdaã§presigned URLãäœæããããšãã§ããŸãïŒ
JavaScript
// ãã®ã¡ãœããã¯presigned urlãæäŸããŸã
// presigned URLãªã³ã¯ã䜿çšããã«ã¯ãCallback-for-preSignedUrl.htmlãã¡ã€ã«ã䜿çšã§ããŸã
var AWS = require('aws-sdk');
var S3 = new AWS.S3({
signatureVersion: 'v4',
});
exports.handler = async (event, context) => {
let fileName;
let bucketName;
let contentType;
bucketName = 'private-s3-for-interfacing';
fileName = event["queryStringParameters"]['fn'];
contentType = 'application/json';
const presignedUrl = S3.getSignedUrl('getObject', {
Bucket: bucketName,
Key: fileName,
Expires: 300 // ç§
});
let responseBody = {'presignedUrl': presignedUrl};
return {
headers: {
'Content-Type': contentType,
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token',
'Access-Control-Allow-Methods': 'GET,OPTIONS'
},
body: JSON.stringify(responseBody),
statusCode: 200
}
};
Lambda颿°ãäœæããããšããããšäžç·ã«ããŒã«ãäœæãããŸãããã ãããã®ããŒã«ã«ã¯ãã©ã€ããŒãS3ãã±ããå
ã®ãªããžã§ã¯ããžã®ã¢ã¯ã»ã¹èš±å¯ããããŸãããæ¬¡ã«ãåã®ã¹ãããã§äœæãããCustomer Managedãããªã·ãŒãLambda颿°ã§äœæããããã®ããŒã«ã«ã¢ã¿ããããå¿
èŠããããŸãã
Lambda颿°ãäœæããåŸã以äžã«ç€ºãããã«èªåçã«äœæãããããŒã«ãèŠã€ããããšãã§ããŸãïŒ

åã®ã¹ãããã§äœæããã«ã¹ã¿ã ããªã·ãŒããã®ããŒã«ã«ã¢ã¿ããããŠãã ãããããã«ãããLambda颿°ãS3ãã±ããã«å¯ŸããŠå¶éããã
GetObjectã¢ã¯ã»ã¹æš©ãæã€ããã«ãªããŸãã
LambdaãS3ãã±ããã«ã¢ã¯ã»ã¹ããããã«å¿
èŠãªããšã¯ããã ãã§ããæ¬¡ã«ãLambda颿°ã䜿çšããããã®AWS Gatewayã¡ãœãããäœæããæéã§ãã
4. Lambda颿°ã䜿çšããããã®Gateway APIäœæ
以äžã«ç€ºãããã«AWS Gateway REST APIãäœæããŠãã ãããå€ãã®ãªãã·ã§ã³ããããŸããããNew APIããšããŠãRESTãAPIãäœæããŠããŸããAPI Gatewayã«ååãä»ããŠãã ããã

AWS GW APIãäœæããŠå®è¡ããããã®ããã€ãã®ã¹ãããããããŸãïŒ
- APIäœæ
- Resourceäœæ
- Methodäœæ
- APIã®ãããã€ïŒDeployïŒ
REST APIã«å¯ŸããŠä»¥äžã«ç€ºãããã«
ResourceãäœæããŠãã ããïŒ
ããã§äœæããããªãœãŒã¹ïŒresourceïŒã¯ãåŸã§APIã®URLã§äœ¿çšãããŸãã

äœæãããªãœãŒã¹ã«å¯ŸããŠ
GETã¡ãœãããäœæããŠãã ããïŒ
ããã§ã¯
GETãPOSTãPUTãDELETEãªã©ã®ä»»æã®HTTPã¡ãœãããäœæã§ããŸããå¿
èŠãªã®ã¯GETã®ã¿ãªã®ã§ãããã ããäœæããŠããŸããåã®ã¹ãããã§äœæããLambda颿°ããã®ã¡ãœããã«ãªã³ã¯ããããšãå¿ããªãã§ãã ãããããã§ã¯Lambda Proxy Integrationããã§ãã¯ãããŠããŸãããã®ã¢ãããŒãã«ããããã¹ãŠã®ã¬ã¹ãã³ã¹é¢é£ã®ã³ã³ãã³ããLambda颿°å
ã§åŠçã§ããŸãã

GETã¡ãœãããäœæãããåŸãAPI Gatewayã¡ãœãããšLambda颿°éã®ãããŒã¯ä»¥äžã®ããã«ãªããŸãïŒ
以äžã«ç€ºãããã«Gateway APIã®CORSãæå¹ã«ããŠãã ãããDefault 4xxãšDefault 5xxãªãã·ã§ã³ããã§ãã¯ã§ããŸããããã«ããããšã©ãŒã§ãã¹ã ãŒãºã«è¿ãããŸãã

AWS Gatewayã¡ãœããã«é¢ãããã¹ãŠãäœæããã³æ§æããåŸãAPIããããã€ïŒdeployïŒããæéã§ããAPIã¯å³ã«ç€ºãããã«ã¹ããŒãžïŒstageïŒã«ãããã€ãããŸãããŸãããã®ã¹ããŒãžåã¯ãããªãã¯API URLã§äœ¿çšãããŸãã

ãããã€åŸãURLã¯ä»¥äžã®ããã«ãªããŸããããã§ããã®ãªã³ã¯ãä»»æã®ã¢ããªã±ãŒã·ã§ã³ãã䜿çšã§ããŸãã

APIã²ãŒããŠã§ã€ãžã®ã¢ã¯ã»ã¹ãå¶éããã«ã¯ãAuthorizerïŒãªãŒãœã©ã€ã¶ãŒïŒãå®çŸ©ããå¿
èŠããããŸãã以äžã«ç€ºãããã«Cognito Authorizerãå®çŸ©ã§ããŸãã
以äžã®å³ã«ç€ºãããã«ãAuthorizationã¯ãèªå¯ãããAPIã¡ãœããã䜿çšããããã«ãªã¯ãšã¹ãã®headeréšåã«è¿œå ããå¿
èŠãããJWTããŒã¯ã³ïŒtokenïŒã§ãã
Cognito Hosted UIãCognitoãŠãŒã¶ãŒ/ãã¹ã¯ãŒãã§éä¿¡ããããšãCognitoã¯ãŠãŒã¶ãŒã
id_tokenãšè¿œå ã®stateããŒã¿ãæž¡ããŠã³ãŒã«ããã¯URLã«ãªãã€ã¬ã¯ãããŸããheaderéšåã«è¿œå ããå¿
èŠãããããŒã¯ã³ãToken Sourceã®äžã§ãAuthorizationããšããååã§ããããšã確èªããŠãã ããã

CognitoããŒã¹ã®Authorizerãå®çŸ©ãããåŸã以äžã®ããã«äœ¿çšã§ããŸãïŒ

äžæ¹ãAPI Gatewayã«Authorizerãå®çŸ©ããããªãå Žåã¯ã以äžã«ç€ºãããã«ãResource PolicyãïŒãªãœãŒã¹ããªã·ãŒïŒã§API URLãžã®ã¢ã¯ã»ã¹ãå¶éã§ããŸãã
Resource Policyã倿Ž/远å ãããå ŽåãAPIãå床ãããã€ããå¿
èŠããããŸãã
xxx.xxx.xxx.xxxãšããŠè¡šç€ºãããIPã¯ããµãŒããŒã®IPã«ããããšãã§ããŸãã誰ããå¥ã®IPããURLã«ã¢ã¯ã»ã¹ããããšãããšã次ã®ã¡ãã»ãŒãžã衚瀺ãããŸãïŒ{"Message":"User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:eu-west-2:********8165:... with an explicit deny"}
Resource Policy JSONã³ãŒãã¯ä»¥äžã®ããã«ãªããŸãïŒ
JSON
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "*"
},
{
"Effect": "Deny",
"Principal": "*",
"Action": "execute-api:Invoke",
"Resource": "*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": "xxx.xxx.xxx.xxx"
}
}
}
]
}
5. Webãã©ã«ããšããŠäœ¿çšãããããªãã¯S3ãã±ãã
ãœãªã¥ãŒã·ã§ã³ã«ã¯2ã€ã®S3ãã±ããïŒbucketïŒãå¿
èŠã§ãã1ã€ç®ã¯åã®ã»ã¯ã·ã§ã³ã§äœæãããŸããã2ã€ç®ã¯çŸåšäœæãããŠãããWebãã©ã«ããšããŠäœ¿çšãããŸãã1ã€ç®ã¯ããã¹ãŠã®ãã¡ã€ã«ãä¿åããããã®ãã©ã€ããŒããã±ãããšããŠäœ¿çšãããŸããã

Webãã©ã«ããšããŠãããªãã¯ãªãããªãã¯ãã±ãããäœæããŠãã ããããã®ãã±ããã«ã¯
callback.htmlãã¡ã€ã«ãå«ãŸãããããCognitoã³ãŒã«ããã¯ïŒcallbackïŒã¢ãã¬ã¹ãšããŠäœ¿çšã§ããŸãã
Webçšã®S3ãã±ããã¯ãããªãã¯ïŒpublicïŒã§ããå¿
èŠããããŸãããã®ããã以äžã®ããªã·ãŒãé©çšã§ããŸãïŒ
JSON
// ããªã·ãŒJSONã¯ãã®ããã«èŠããŸã
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::web-s3-for-interfacing/*"
}
]
}
ãœãŒã¹ãã¡ã€ã«ã®ããŠã³ããŒã
Callback.htmlããã³ãã®ä»ã®ãœãŒã¹ãã¡ã€ã«ã¯ã以äžã®ãªã³ã¯ããããŠã³ããŒãã§ããŸãïŒ- ãœãŒã¹ã³ãŒããããŠã³ããŒãïŒZIPïŒ- 3.9 KB
- ãœãŒã¹ã³ãŒããããŠã³ããŒãïŒRARïŒ- 3.6 KB
6. CognitoãŠãŒã¶ãŒããŒã«ã®äœæãšæ§æ
- Callbackã¢ãã¬ã¹ïŒ
https://web-s3-for-interfacing.s3.eu-west-2.amazonaws.com/Callback.html - OAuth 2.0 FlowsïŒ ãimplicit grantããªãã·ã§ã³ããã§ãã¯ããŠãã ããã
- OAuth 2.0 ScopesïŒ emailãopenidãprofileã
以äžã®hosted UIãªã³ã¯ã確èªããŠãã ããã
Hosted Cognitoãã°ã€ã³ããŒãžã«ãã©ã¡ãŒã¿ãéä¿¡ããããã«è¿œå ã®ãstateãURLãã©ã¡ãŒã¿ã远å ããŠãã ããããstateããã©ã¡ãŒã¿ã¯
Callback.htmlãã¡ã€ã«ã«æž¡ãããŸããCognito Hosted UIãªã³ã¯ã«ã¯ã以äžã«ç€ºãããã«å€ãã®URLãã©ã¡ãŒã¿ãå«ãŸããŠããŸãïŒ
https://test-for-user-pool-for-s3.auth.eu-west-2.amazoncognito.com/login?client_id=7uuggclp7269oguth08mi2ee04&response_type=token&scope=openid+profile+email&redirect_uri=https://web-s3-for-interfacing.s3.eu-west-2.amazonaws.com/Callback.html&state=fn=testFile.pdfãã£ãŒã«ãïŒ
client_id=7uuggclp7269oguth08mi2ee04response_type=tokenscope=openid+profile+emailredirect_uri=https://web-s3-for-interfacing.s3.eu-west-2.amazonaws.com/Callback.htmlstate=fn=testFile.pdf
stateã¯ã«ã¹ã¿ã URLãã©ã¡ãŒã¿ã§ããHosted UIããŒãžã«éä¿¡ã§ããCallback.htmlããŒãžã«è¿ãããŸãã以äžã«ç€ºãããã«client appãäœæããå¿
èŠããããŸãïŒ

App clientèšå®ã¯ä»¥äžã®ããã«ç¢ºèªã§ããŸãïŒ

Hosted UIã®URLãšããŠäœ¿çšããããã«ãã¡ã€ã³åïŒdomain nameïŒãèšå®ããå¿
èŠããããŸãã

7. ã·ããªãªã®ãã¹ãæ¹æ³
CognitoãŠãŒã¶ãŒããŒã«ã䜿çšããŠå¶éãããã¢ã¯ã»ã¹ãèš±å¯ããAPIã®ãã¹ãæ¹æ³ãèŠãŠã¿ãŸãããã
ä»»æã®ãšã³ããŠãŒã¶ãŒããã®ããã»ã¹ãéå§ããããã«ãªã³ã¯ãã¯ãªãã¯ã§ããŸãã以äžã®HTMLã³ã³ãã³ãããã¹ãããWebããŒãžããããšä»®å®ããŸããããã芧ã®ãšãããåãã¡ã€ã«ãžã®ãªã³ã¯ã¯Cognito hosted UIã®URLã§ãã
LinkToS3Files.htmlãã¡ã€ã«ã䜿çšããŠã·ããªãªããã¹ãã§ããŸãããã¹ããã¡ã€ã«ã®ããŠã³ããŒã
çµè«
ãã®èšäºãAWSã¯ã©ãŠãç°å¢ã®åå¿è
ã«ãšã£ãŠåœ¹ç«ã€ããšãé¡ã£ãŠããŸãã
ã¯ã©ãŠãã³ã³ãã¥ãŒãã£ã³ã°ãµãŒãã¹
AWSãAzureãGoogle Cloudãã©ãããã©ãŒã ã§ã®ã€ã³ãã©ã¹ãã©ã¯ãã£èšèšãç§»è¡ã管çãæé©åãµãŒãã¹ãæäŸããŠããŸãã
ãµãŒãã¹ãèŠããåãåãã
AWSãšã¯ã©ãŠãã³ã³ãã¥ãŒãã£ã³ã°ãœãªã¥ãŒã·ã§ã³ã®è©³çްã«ã€ããŠã¯ãããŒã ã«ãåãåãããã ããã
ãåãåãã