Basics

See what we're up to: Runway is here! 🚀

Basics #

To apply a policy we recommend using one of the AWS SDKs (in your favorite language) or the awscli:

❯ python -m pip install awscli

Both include validation and error handling which make working with these API a much better experience than building signatures yourself and piping calls to curl.

AWSCLI #

Create/save your policy to policy.json and then apply it using the following command:

❯ aws s3api put-bucket-policy \
 --bucket bucket-name.example.org \
 --policy file://policy.json

SDK Example #

For this demonstration, we utilized Golang, but the method calls will be quite similar with the SDK in your preferred programming language. To maintain brevity in the examples, we won’t reproduce this fully functional program on each individual page.

package main

import (
  "json"

  "github.com/aws/aws-sdk-go/aws"
  "github.com/aws/aws-sdk-go/aws/credentials"
  "github.com/aws/aws-sdk-go/aws/session"
  "github.com/aws/aws-sdk-go/service/s3"
)

func main() {
  // initialize the credential session
  sess := session.Must(session.NewSession(&aws.Config{
    Region:                    aws.String("unused"),
    Credentials:               credentials.NewStaticCredentials(
      "your-key-id",
      "your-secret",
      ""),
    S3ForcePathStyle:          aws.Bool(true),
    DisableEndpointHostPrefix: aws.Bool(true),
  }))

  // create service client
  svc := s3.New(sess, aws.NewConfig().
    WithEndpoint("https://s3.storage.planetary-networks.de"))

  bucket := "bucket-name.example.org"

  rawPolicy := map[string]interface{}{
    "Version": "2012-10-17",
    "Statement": []map[string]interface{}{
      {
        "Effect": "Allow",
        "Action": []string{
          "s3:ListBucket",
          "s3:GetObject",
        },
        "Resource": []string{
          "arn:aws:s3:::" + bucket,
          "arn:aws:s3:::" + bucket + "/*",
        },
        "Principal": "*",
      },
    },
  }

  // encode to json
  policy, _ := json.Marshal(rawPolicy)

  // set policy
  svc.PutBucketPolicy(&s3.PutBucketPolicyInput{
    Bucket: &bucket,
    Policy: aws.String(string(policy)),
  })