AWS non fornisce una risorsa CloudFormation ufficiale per creare oggetti all'interno di un bucket S3. Tuttavia, è possibile creare un Lambda-backed Custom Resource per eseguire questa funzione utilizzando l'SDK AWS, e infatti il repository GitHub gilt/cloudformation-helpers fornisce una risorsa personalizzata immediatamente disponibile che fa proprio questo.
Come con qualsiasi impostazione di risorsa personalizzata è un po 'prolisso, poiché è necessario prima distribuire la funzione Lambda e le autorizzazioni IAM, quindi fare riferimento come risorsa personalizzata nel modello di stack.
In primo luogo, aggiungere le risorse Lambda::Function
e associati IAM::Role
al modello stack:
"S3PutObjectFunctionRole": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Version" : "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [ "lambda.amazonaws.com" ]
},
"Action": [ "sts:AssumeRole" ]
}
]
},
"ManagedPolicyArns": [
{ "Ref": "RoleBasePolicy" }
],
"Policies": [
{
"PolicyName": "S3Writer",
"PolicyDocument": {
"Version" : "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:DeleteObject",
"s3:ListBucket",
"s3:PutObject"
],
"Resource": "*"
}
]
}
}
]
}
},
"S3PutObjectFunction": {
"Type": "AWS::Lambda::Function",
"Properties": {
"Code": {
"S3Bucket": "com.gilt.public.backoffice",
"S3Key": "lambda_functions/cloudformation-helpers.zip"
},
"Description": "Used to put objects into S3.",
"Handler": "aws/s3.putObject",
"Role": {"Fn::GetAtt" : [ "S3PutObjectFunctionRole", "Arn" ] },
"Runtime": "nodejs",
"Timeout": 30
},
"DependsOn": [
"S3PutObjectFunctionRole"
]
},
Quindi è possibile utilizzare la funzione Lambda come una risorsa personalizzata per creare l'oggetto S3:
"MyFolder": {
"Type": "Custom::S3PutObject",
"Properties": {
"ServiceToken": { "Fn::GetAtt" : ["S3PutObjectFunction", "Arn"] },
"Bucket": "mybucket",
"Key": "myfolder/"
}
},
È È inoltre possibile utilizzare la stessa risorsa personalizzata per scrivere un oggetto S3 basato su stringhe aggiungendo un parametro Body
oltre a Bucket
e Key
(vedere docs).
in realtà ho bisogno di richiamare i js di cloudformation inseriti in una cartella sotto il bucket S3 da una funzione Lambda ... quindi dove dovrei posizionare i miei js se la cartella non è richiesta per essere creata in anticipo ??? – shiv455
Potrebbe fornire ulteriori informazioni sui requisiti effettivi (ad es. Cosa intendi con "richiama i jsons di cloudformation")? Il modo migliore è aggiornare la domanda originale con un esempio di ciò che hai provato e di quali problemi hai incontrato. –
Aggiornato la mia domanda per favore controlla !!! .. Sto cercando di creare più risorse (SNS, EC2 ecc.) Usando AWS lambda che richiama create_stack api in cui nestedstack.json è uno dei parametri .... – shiv455