Webホスティング機能を利用するs3_webhosting.yml1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071AWSTemplateFormatVersion: '2010-09-09'Description: S3 Webhosting# ------------------------------------------------------------ ## Input Parameters# ------------------------------------------------------------ #Parameters: S3BucketName: Description: A name for the WebContents buckets. Type: String S3BucketNameLog: Description: A name for the Log buckets. Type: StringResources:# ------------------------------------------------------------ ## S3# ------------------------------------------------------------ # S3BucketContents: Type: AWS::S3::Bucket #DeletionPolicy: Retain Properties: BucketName: !Sub ${S3BucketName} AccessControl: PublicRead WebsiteConfiguration: IndexDocument: index.html ErrorDocument: error.html LoggingConfiguration: DestinationBucketName: !Ref S3BucketLog LogFilePrefix: !Sub "/logs/${S3BucketName}/" S3BucketContentsPolicy: Type: AWS::S3::BucketPolicy Properties: Bucket: !Ref S3BucketContents PolicyDocument: Statement: Action: - "s3:GetObject" Effect: "Allow" Resource: !Sub "arn:aws:s3:::${S3BucketName}/*" Principal: "*" S3BucketLog: Type: "AWS::S3::Bucket" Properties: BucketName: !Ref S3BucketNameLog AccessControl: LogDeliveryWrite BucketEncryption: ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: SSEAlgorithm: AES256 LifecycleConfiguration: Rules: - Id: !Sub "${S3BucketNameLog}-log-LifeCycle" Status: Enabled Prefix: log/ ExpirationInDays: 365 Transitions: - StorageClass: GLACIER TransitionInDays: 180# ------------------------------------------------------------ ## Output Parameters# ------------------------------------------------------------ #Outputs: S3BucketName: Value: !Ref S3BucketContents WebsiteURL: Value: !GetAtt S3BucketContents.WebsiteURL Description: URL for website hosted on S3 カスタムエラードキュメント (オプション) カスタムエラードキュメントの設定 HTTP 404 Not Foundをカスタマイズすることができる。 123WebsiteConfiguration: IndexDocument: index.html ErrorDocument: error.html コンテンツのアップロード12345678$ aws s3 ls s3://web.nullpo.io$ aws s3 cp contents/index.html s3://web.nullpo.io/upload: contents/index.html to s3://web.nullpo.io/index.html$ aws s3 cp contents/error.html s3://web.nullpo.io/upload: contents/error.html to s3://web.nullpo.io/error.html$ aws s3 ls s3://web.nullpo.io2020-05-01 22:38:45 79 error.html2020-05-01 22:38:37 79 index.html S3バケットにコンテンツがあるとスタック削除で削除エラーになるスタックの削除でStackStatusReason: The following resource(s) failed to delete: [S3BucketContents]のエラーとなる。イベントでみるとThe bucket you tried to delete is not empty (Service: Amazon S3; Status Code: 409; Error Code: BucketNotEmpty;でバケットが空でないため削除できない。 デフォルトのDeletionPolicy: Deleteの場合、バケットを空にする必要がある。 DeletionPolicy 属性 AWS CloudFormation はスタックの削除時にリソースと (該当する場合) そのすべてのコンテンツを削除します。この削除ポリシーは、あらゆるリソースタイプに追加することができます。デフォルトでは、DeletionPolicy を指定しない場合、AWS CloudFormation はリソースを削除します。Amazon S3 バケットでは、削除を成功させるためにはバケットのすべてのオブジェクトを削除する必要があります。 スタック自体はそのまま削除させ、空でないバケットはそのまま残す方法もある。DeletionPolicy: Retainを指定すれば、コンテンツとバケットは残り、スタックは削除される。 S3バケットのコンテンツを空するバケットのコンテンツを空にするにはaws s3 rmで削除が可能。 123$ aws s3 rm s3://web.nullpo.io/ --recursivedelete: s3://web.nullpo.io/index.htmldelete: s3://web.nullpo.io/error.html S3バケットとコンテンツを削除するバケットも削除するにはaws s3 rbを使用する。 123456$ aws s3 rb s3://web.nullpo.io/remove_bucket failed: s3://web.nullpo.io/ An error occurred (BucketNotEmpty) when calling the DeleteBucket operation: The bucket you tried to delete is not empty$ aws s3 rb s3://web.nullpo.io/ --forcedelete: s3://web.nullpo.io/index.htmldelete: s3://web.nullpo.io/error.htmlremove_bucket: web.nullpo.io ログはベストエフォート型の記録アクセスログはすぐに出力されない。テストした際にはアクセス可能になるまで、1時間程度を要した。 Amazon S3 サーバーアクセスのログ記録 サーバーアクセスログレコードの配信は、ベストエフォートで行われます。ログ記録用に適切にバケットを設定した場合、そのバケットへのほとんどのリクエストについてログレコードが配信されます。ほとんどのログレコードは、記録された時間から数時間以内に配信されますが、配信間隔は短くなる場合もあります。サーバーログの完全性や適時性は保証されません。リクエストのログレコードが、リクエストが実際に処理されてからかなり後に配信されたり、配信すらされないこともあり得ます。サーバーログの目的は、バケットに対するトラフィックの特性を理解することです。ログレコードが失われることはまれですが、すべてのリクエストが完全に報告されるとは限りません。