はじめに
前回、AWSブログで公開されていた署名付きアップロード・ダウンロードの構成をAWSマネジメントコンソール画面から構築しましたが、色々と使えそうなので、terraformの勉強も兼ねてterraform化したので公開しようと思います。
元のブログ記事
公開場所
以下GitHubで公開しています。
terraformについて
本terraformはVPC等を使用していないため、環境に合わせて修正したりしなくても実行できるかと思います。
また、各リソースの名前等は前回の記事で設定している名前に合わせています。
各リソースの名前等はvariables.tfにまとめているので、環境に合わせて修正してください。
以下、特記事項について示します。
SMS External ID
前回、CognitoでSMS認証の設定を行いましたが、画面上から行った場合は自動でSMSの外部IDといったIDが設定されますが、terraformで作成する場合は自分で設定する必要があるようです。
他の外部サービスと連携したりしなければ、意識する必要はないようなので、適当なUUIDを指定しておきます。
以下コマンドでUUIDを生成できるので、生成したIDを入力しておきます。
uuidgen | tr "[:upper:]" "[:lower:]"
S3へのファイルアップロード
aws_s3_objectリソースを使ってS3にファイルをアップロードすると、アップロードしたファイルのContent-Typeがbinary/octet-streamとなってしまうことで、アップロード・ダウンロードを行う際にJavaScriptが実行できなくなります。
Terraform Template Directory Moduleを使用して、Content-Typeを付与することで回避しました。
ファイルが更新された場合のアップロード
aws_s3_objectリソースでetagを設定しておくと、ファイルが更新された際にハッシュ値比較して、ファイルが更新されていればアップロードを行うようになるそうです。便利!
terraform apply後のアクセス
OutputでエントランスページのURLを出力するようにしているため、apply後は出力されたURLにアクセスします。
(省略)
Outputs:
Entrance_Page_URL = "https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/web/entrance.html"
アクセス時の注意点
terraformで作成すると、数十秒程度で構築できますが、裏でAPI Gateway等のデプロイ作業が行われているので、10分程度は待つようにしましょう。
ページアクセスはできますが、デプロイ途中の場合、アップロード、ダウンロードに失敗します。
おわりに
今回はブログで紹介されていた構成をそのままterraformで作っただけなので、拡張性は考えずmodule等も使用しておりませんが、勉強がてらterraformに慣れるのにはちょうどよかったです。
今回の構成をベースに認証方式を変えたりしながら、今後どこかのシステムに導入できれば良いなと感じました。