Since version 9.0.1 (if I am not mistaken) ColdFusion supports Amazon's S3 file storage pretty much out of the box. The complexities of access control to your bucket is abstracted away and you can use S3 almost like a local file system. You can read more about it in the CF docs and on Ray Camden's blog.

My task at hand was to accept user submitted file uploads and store them in S3. According to the CF documentation the full set of cffile operations is supported, however I could not get it to work.
The following failed for me with a 'destination invalid' error:

view plain
1<cfset mydir = "s3://">
2<cffile action="upload" filefield="logo" destination="#mydir#" nameconflict="makeunique" charset="utf-8" />

Please note that in order for the s3:// syntax to resolve to your bucket you need to follow some setup steps which I won't cover here. Also watch out for a bug related to setting metadata.

The way I managed to work around the bug related to not being able to upload files directly into S3 I uploaded to my CF server first and then effectively moved the image into S3. This seemed to work:

view plain
1<cfset mydir = "s3://">
3<!--- upload to own server --->
4<cffile action="upload" filefield="logo" destination="#expandpath('./')#" nameconflict="makeunique" charset="utf-8" />
5<!--- create a unique name to save the image as --->
6<cfset logoImage = "#createUUID()#.#cffile.serverFileExt#" />
8<cfset imgPathLocal = "#expandpath('./')#/#cffile.serverFile#">
10<!--- open local image, then write to S3 --->
11<cfset localImage = imageRead("#imgPathLocal#")>
12<cfset imageWrite(localImage, "#mydir#/#logoImage#")>
14<!--- set permissions on the newly created file on S3 --->
15 <cfset perms = [
16 {group="all", permission="read"}
17 ]

18<cfset StoreAddACL("#mydir#/#logoImage#","#perms#")>    
20<!--- delete the local image now --->
21<cfif fileexists("#imgPathLocal#")>
22     <cffile action="delete" file="#imgPathLocal#">

Note that this code is untested in its current form but should give you the idea. Hope it helps.