β
Short Answer:
NO, you do not necessarily need AWS PrivateLink to move data from S3 to Snowflake.
β
Longer Answer:
Normally, the basic and secure connection between AWS S3 and Snowflake happens via IAM role-based access (with proper policies) and Snowflake External Stages.
This process works over the public internet but secured by:
π΅ PrivateLink is only needed if you want an extra layer of network-level private security β like no traffic leaving AWS public internet at all.
You may need PrivateLink if:
| Use Case | Need PrivateLink? | Reason |
|---|---|---|
| Standard S3 to Snowflake data load | β No | IAM role trust + HTTPS is enough |
| You want VPC-to-Snowflake network without touching public internet | β Yes | VPC PrivateLink to Snowflake |
| You want S3 bucket access from Snowflake without going over public internet | β Optional | Use S3 VPC Endpoint or S3 PrivateLink |
| Setup | PrivateLink Needed? | Notes |
|---|---|---|
| S3 β Snowflake (via External Stage, COPY INTO) | β No | Use IAM role + Storage Integration |
| S3 β Snowflake via AppFlow | β No | AWS AppFlow securely connects via AWS SDK |
| S3 inside VPC Endpoint, Snowflake with PrivateLink | β Yes | If strict compliance (HIPAA, PCI, etc.) requires |
| Ultra-secure Snowflake deployments (like Financial Data) | β Yes | Use PrivateLink into Snowflake account |
Your steps:
π NO PrivateLink is required for this setup to work.
β Just be sure your S3 bucket is properly restricted to the Snowflake IAM Role.
| Question | Answer |
|---|---|
| Do you need PrivateLink to load data from AWS to Snowflake? | β No |
| When might you use PrivateLink? | β If you want private network routing, zero public internet exposure |
| Is your current S3 + IAM + Storage Integration + COPY INTO method okay? | β Yes, it's industry standard |
Would you like me to also show you: - A simple diagram of S3 β Snowflake data flow? - A sample Snowflake Storage Integration SQL example you can copy-paste?
π
Awesome! Let's make it super easy and crystal clear: π―
Your Data
β
S3 Bucket (AWS)
β (IAM Role with trust to Snowflake)
Snowflake Storage Integration
β
Snowflake External Stage
β
Snowflake Table (via COPY INTO)Hereβs a real-world minimal example you can copy-paste:
CREATE STORAGE INTEGRATION my_s3_integration
TYPE = EXTERNAL_STAGE
STORAGE_PROVIDER = S3
ENABLED = TRUE
STORAGE_AWS_ROLE_ARN = 'arn:aws:iam::123456789012:role/SnowflakeS3Role'
STORAGE_ALLOWED_LOCATIONS = ('s3://your-bucket-name/path/');β
This tells Snowflake:
- Use S3
- Trust the specified AWS IAM Role
- Only allow reading from your-bucket-name/path/
DESCRIBE INTEGRATION my_s3_integration;β
Important!
This will output 2 important things:
STORAGE_AWS_IAM_USER_ARNSTORAGE_AWS_EXTERNAL_IDYou need these to update your AWS IAM Role trust policy next.
In AWS IAM, modify the Trust Relationship:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::snowflake-account-id:user/snowflake-storage-user"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "auto-generated-external-id-from-snowflake"
}
}
}
]
}β
Replace:
- snowflake-account-id with Snowflake's AWS account ID
- auto-generated-external-id-from-snowflake with your External ID from step 2
CREATE STAGE my_s3_stage
URL = 's3://your-bucket-name/path/'
STORAGE_INTEGRATION = my_s3_integration
FILE_FORMAT = (TYPE = CSV FIELD_OPTIONALLY_ENCLOSED_BY='"');β Now Snowflake can securely access S3 via External Stage.
COPY INTO your_table
FROM @my_s3_stage
FILE_FORMAT = (TYPE = CSV)
PATTERN = '.*.csv'; -- optional if you want to match only .csv filesβ This command reads files from S3 β loads into your Snowflake table!
[S3 Bucket]
β IAM Role Trust
[Snowflake Storage Integration]
β
[Snowflake External Stage @my_s3_stage]
β
[COPY INTO your_table]No PrivateLink needed. Only HTTPS + IAM security.
Optional, you can restrict your bucket further:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowSnowflakeAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/SnowflakeS3Role"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket-name/path/*"
}
]
}β
So only Snowflake's role can access objects under your-bucket-name/path/.
| Step | What you do |
|---|---|
| 1 | Create Storage Integration in Snowflake |
| 2 | Update AWS IAM Role trust policy |
| 3 | Create External Stage in Snowflake |
| 4 | Run COPY INTO to load data |
Would you also like me to show you a ready-to-copy full Terraform template π to automate all this setup (AWS + Snowflake)? π―
It will save you a lot of manual steps if you plan to repeat or automate deployments!
Shall I prepare that too? πβ¨
(Just say "Terraform please" if you want!)