1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192open!StdLabels[@@warning"-66"]letsprintf=Printf.sprintfopenProtocol_conv_jsontypetime=floatlettime_of_json_exnt=tryJson.to_stringt|>Time.parse_iso8601_stringwith|_->raiseJson.(Protocol_error(make_error~value:t"Not an iso8601 string"))let%test"time conv"=time_of_json_exn(`String"2018-08-06T19:26:20Z")=1533583580.typet={access_key:string[@key"AccessKeyId"];secret_key:string[@key"SecretAccessKey"];token:stringoption[@key"Token"];expiration:timeoption[@key"Expiration"];}[@@derivingof_protocol~driver:(moduleJson)]letmake~access_key~secret_key?token?expiration()={access_key;secret_key;token;expiration}moduleMake(Io:Types.Io)=structmoduleHttp=Http.Make(Io)moduleBody=Body.Make(Io)openIoopenDeferredmoduleIam=structletinstance_data_endpoint=letinstance_data_host="instance-data.ec2.internal"inletinstance_region=Region.Otherinstance_data_hostinRegion.endpoint~inet:`V4~scheme:`Httpinstance_regionletget_role()=letpath="/latest/meta-data/iam/security-credentials/"inletbody,sink=letreader,writer=Pipe.create()inBody.to_stringreader,writerinHttp.call~endpoint:instance_data_endpoint~path~sink~headers:Headers.empty`GET>>=?fun(status,message,_headers,error_body)->matchstatuswith|codewhencode>=200&&code<300->body>>=funbody->Deferred.Or_error.returnbody|_->letmsg=sprintf"Failed to get role. %s. Reponse %s"messageerror_bodyinDeferred.Or_error.fail(Failuremsg)letget_credentialsrole=letpath=sprintf"/latest/meta-data/iam/security-credentials/%s"roleinletbody,sink=letreader,writer=Pipe.create()inBody.to_stringreader,writerinHttp.call~endpoint:instance_data_endpoint~path~sink~headers:Headers.empty`GET>>=?fun(status,message,_headers,error_body)->matchstatuswith|codewhencode>=200&&code<300->body>>=funbody->letjson=Yojson.Safe.from_stringbodyinDeferred.Or_error.catch(fun()->of_json_exnjson|>Deferred.Or_error.return)|_->letmsg=sprintf"Failed to get credentials. %s. Reponse %s"messageerror_bodyinDeferred.Or_error.fail(Failuremsg)endmoduleLocal=structletget_credentials?(profile="default")()=lethome=Sys.getenv_opt"HOME"|>functionSomev->v|None->"."inletcreds_file=Printf.sprintf"%s/.aws/credentials"homeinDeferred.Or_error.catch@@fun()->letini=newInifiles.inifilecreds_fileinletaccess_key=ini#getvalprofile"aws_access_key_id"inletsecret_key=ini#getvalprofile"aws_secret_access_key"inmake~access_key~secret_key()|>Deferred.Or_error.returnendmoduleHelper=structletget_credentials?profile()=matchprofilewith|Someprofile->Local.get_credentials~profile()|None->beginLocal.get_credentials~profile:"default"()>>=function|Result.Okc->Deferred.Or_error.returnc|Error_->Iam.get_role()>>=?funrole->Iam.get_credentialsroleendendend