hello-world.jp.net
webエンジニアのメモ。とりあえずやってみる。

AWS SAMを使って署名付きURL発行APIを作る

公開日時

S3の署名付きURL発行機能の検証を兼ねて、S3のキーをパラメータとして受け取り、署名付きURLを発行するAPIを作ってみました。

はじめはマネージメントコンソールから手動で試していましたが、AWS SAMを使ってコード管理するようにしました。

ソースコードはこちら https://github.com/hilotter/SignedUrlApi

できること

S3のオブジェクトキーをパラメータに付与すると署名付きのURLを発行します。オブジェクトキーごとに有効期限も設定可能です。(デフォルトは300秒)

また、APIの利用にはAPIキーによるアクセス制限をかけています。

※ コンテンツ自体は事前にS3にアップロードしておく必要があります。

# 例:sample.pngに60秒間アクセス可能な署名付きURLを生成する場合
curl -H "x-api-key:{API KEY}" "https://XXXX.execute-api.ap-northeast-1.amazonaws.com/Prod/signed-url?key=sample.png&expires=60"

自身のAWS環境にデプロイしたい場合

  • コンテンツ保存用のS3バケットを作成

  • SAMで使用するLambdaコードのアップロード用S3バケットを作成

  • AWS SAM CLIをインストール

  • SignedUrlApiをforkしてcloneしてくる

  • template.yamlのBucketNameを書き換える

BucketName: Type: String Default: signed-url-test # TODO: change your bucket name
  • デプロイ
# Lambda functionをzip化してs3にアップロード
sam package --template-file template.yaml --output-template-file packaged.yaml --s3-bucket sam-deploy-sample

# Cloudformationでデプロイ
sam deploy --template-file packaged.yaml --stack-name signedUrl --capabilities CAPABILITY\_IAM
  • マネージメントコンソールでAPI Gatewayの管理画面にアクセスし、API endpointとAPIキーを確認してcurlなりで試す

SAMを使うことでIAMロールポリシーもコード管理できるので便利ですね。

参考


Related #aws

[ELB]SSL証明書設定の権限を持つIAMユーザPolicy

もともとはAWSの明細情報閲覧と、IAM管理を無効にしたユーザとして、以下のようなPolicy設定を行っていました。

[aws][mysql5.6]microインスタンス使用時にメモリ不足になったのでmysqlの設定を調整

AWSでt2.microインスタンスを使用して色々動かしていたら、あるスクリプトの実行時に

[aws]s3バケットにIP制限をかける

s3にはbasic認証を設定することはできないのですが、IP制限なら設定することができます。

[rails]cap deploy時に複数のAuto Scalingグループにもデプロイしたい

先日、AWSのAuto Scallingを使った際に、cap deploy時にAuto Scaleインスタンスにも自動でデプロイできるようにする必要があったので調べたところ、