<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>S3 | 伊東屋TECHブログ</title>
	<atom:link href="https://tech-itoya.com/tag/s3/feed/" rel="self" type="application/rss+xml" />
	<link>https://tech-itoya.com</link>
	<description>千葉県・船橋市の総合園芸店が運営する技術ブログ</description>
	<lastBuildDate>Sun, 05 Oct 2025 00:15:12 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>

<image>
	<url>https://tech-itoya.com/wp-content/uploads/2024/10/cropped-itoya-logo-32x32.png</url>
	<title>S3 | 伊東屋TECHブログ</title>
	<link>https://tech-itoya.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>SSOユーザーごとにS3アクセスを制御するバケットポリシーの書き方</title>
		<link>https://tech-itoya.com/identity-center%e3%81%a7sso%e3%81%97%e3%81%9f%e5%80%8b%e5%88%a5%e3%83%a6%e3%83%bc%e3%82%b6%e3%83%bc%e3%81%94%e3%81%a8%e3%81%abs3%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e3%82%92%e5%88%b6%e5%be%a1%e3%81%99/</link>
					<comments>https://tech-itoya.com/identity-center%e3%81%a7sso%e3%81%97%e3%81%9f%e5%80%8b%e5%88%a5%e3%83%a6%e3%83%bc%e3%82%b6%e3%83%bc%e3%81%94%e3%81%a8%e3%81%abs3%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e3%82%92%e5%88%b6%e5%be%a1%e3%81%99/#respond</comments>
		
		<dc:creator><![CDATA[tori-dash]]></dc:creator>
		<pubDate>Sat, 28 Dec 2024 01:35:49 +0000</pubDate>
				<category><![CDATA[TECH記事]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[IAM]]></category>
		<category><![CDATA[Identity Center]]></category>
		<category><![CDATA[S3]]></category>
		<guid isPermaLink="false">https://tech-itoya.com/?p=285</guid>

					<description><![CDATA[こんにちはとりです。 今回はIdentiy Centerで管理しているSSOユーザーごとにS3アクセスを制御したいときのバケットポリシーの書き方について記事になります。 ポリシー自体はシンプルになったのですが、どの条件で [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちはとりです。</p>



<p>今回はIdentiy Centerで管理しているSSOユーザーごとにS3アクセスを制御したいときのバケットポリシーの書き方について記事になります。</p>



<p>ポリシー自体はシンプルになったのですが、どの条件でコントロールすればうまくいくか案外迷ったので、同じような方の参考になれば幸いです。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">想定している構成</a></li><li><a href="#toc2" tabindex="0">ポリシーの書き方</a></li><li><a href="#toc3" tabindex="0">おまけ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">想定している構成</span></h2>



<p>細かい要件としては以下を想定しています</p>



<ul class="wp-block-list">
<li>AWS 利用者は <strong>authority-A </strong>という許可セットを使って、対象のAWSアカウントにアクセスする</li>



<li><strong>authority-A</strong> は対象AWSアカウント内のS3全般に対して広めのアクセス権限をもっている</li>



<li>AWSアカウント内の特定のS3バケットだけは、特定ユーザーだけ見れるようにしたい。</li>
</ul>



<p>SSOの許可セットで広めに AWS 権限を与えているものの、特定のS3バケットについては見れるユーザーを絞りたいというケースになります</p>



<figure class="wp-block-image size-full is-resized"><img fetchpriority="high" decoding="async" width="551" height="182" src="https://tech-itoya.com/wp-content/uploads/2024/12/tori-20241228-01-1.png" alt="" class="wp-image-295" style="width:702px;height:auto" srcset="https://tech-itoya.com/wp-content/uploads/2024/12/tori-20241228-01-1.png 551w, https://tech-itoya.com/wp-content/uploads/2024/12/tori-20241228-01-1-300x99.png 300w" sizes="(max-width: 551px) 100vw, 551px" /></figure>



<h2 class="wp-block-heading"><span id="toc2">ポリシーの書き方</span></h2>



<p>結果シンプルになりましたが、以下のようなポリシーで実現できました</p>



<p>S3に限らずIAM全般では明示的な Deny がある場合、それが最初に評価されるため、許可セット(<strong>authority-A</strong>)がアクセス権限を持っていたとしても、Deny 条件にマッチすればアクセスできなくなります。</p>



<pre class="wp-block-code"><code>{
	"Version": "2012-10-17",
	"Statement": &#91;
		{
			"Sid": "SSOTest",
			"Effect": "Deny",
			"Principal": "*",
			"Action": "*",
			"Resource": &#91;
                             "arn:aws:s3:::&lt;S3 バケット名&gt;/*",
                             "arn:aws:s3:::&lt;S3 バケット名&gt;"
                        ],
			"Condition": {
				"StringNotLike": {
					"aws:userId": "AROA*:&lt;SSO ユーザー名&gt;*"
				}
			}
		}
	]
}</code></pre>



<p>SSO ユーザー名を確認したい場合は、以下コマンドを叩いて確認できます</p>



<pre class="wp-block-code"><code>aws sts get-caller-identity --output yaml</code></pre>



<p>注意点としては先ほど書いたように、Deny 句があると最初にそれが評価されるため、SSOユーザー以外にもアクセスしてくるプリンシパル(例えばECSやlambda)がいる場合、適宜 <strong>Condition</strong> 句でdeny対象から外す必要があります。</p>



<h2 class="wp-block-heading"><span id="toc3">おまけ</span></h2>



<p>最初やろうとしてダメだった方法も書いておきます</p>



<p>SSO から 払いだされるフェデレーテッドユーザーの形式も <strong>&lt;許可セット名&gt;/&lt;SSO ユーザー名&gt; </strong>で、SSOユーザー名含んでいたので、これでポリシーかけないかな？と思ったのですがダメそうでした。</p>



<p>↓の感じで条件書いてみたのですが、許可セットまでは制御がきくものの SSO ユーザー名までは <code>aws:PrincipalARN</code> に含められないようです</p>



<pre class="wp-block-code"><code>"Condition": {
	"StringNotLike": {
		"aws:PrincipalARN": "arn:aws:iam::*:role/aws-reserved/sso.amazonaws.com/*/AWSReservedSSO_&lt;許可セット名&gt;/&lt;SSO ユーザー名&gt;"
        }
}</code></pre>



<p></p>
		<div class="wpulike wpulike-heart " ><div class="wp_ulike_general_class wp_ulike_is_restricted"><button type="button"
					aria-label="いいねボタン"
					data-ulike-id="285"
					data-ulike-nonce="6b46aab027"
					data-ulike-type="post"
					data-ulike-template="wpulike-heart"
					data-ulike-display-likers=""
					data-ulike-likers-style="popover"
					class="wp_ulike_btn wp_ulike_put_image wp_post_btn_285"></button><span class="count-box wp_ulike_counter_up" data-ulike-counter-value="+1"></span>			</div></div>
	]]></content:encoded>
					
					<wfw:commentRss>https://tech-itoya.com/identity-center%e3%81%a7sso%e3%81%97%e3%81%9f%e5%80%8b%e5%88%a5%e3%83%a6%e3%83%bc%e3%82%b6%e3%83%bc%e3%81%94%e3%81%a8%e3%81%abs3%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e3%82%92%e5%88%b6%e5%be%a1%e3%81%99/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ALB + S3 + Lambda で画像やデザイン含むちょっとリッチなメンテナンス画面をお手軽実装で表示させる</title>
		<link>https://tech-itoya.com/alb-s3-lambda-%e3%81%a7%e7%94%bb%e5%83%8f%e3%82%84%e3%83%87%e3%82%b6%e3%82%a4%e3%83%b3%e5%90%ab%e3%82%80%e3%81%a1%e3%82%87%e3%81%a3%e3%81%a8%e3%83%aa%e3%83%83%e3%83%81%e3%81%aa%e3%83%a1%e3%83%b3/</link>
					<comments>https://tech-itoya.com/alb-s3-lambda-%e3%81%a7%e7%94%bb%e5%83%8f%e3%82%84%e3%83%87%e3%82%b6%e3%82%a4%e3%83%b3%e5%90%ab%e3%82%80%e3%81%a1%e3%82%87%e3%81%a3%e3%81%a8%e3%83%aa%e3%83%83%e3%83%81%e3%81%aa%e3%83%a1%e3%83%b3/#respond</comments>
		
		<dc:creator><![CDATA[tori-dash]]></dc:creator>
		<pubDate>Sun, 06 Oct 2024 02:51:53 +0000</pubDate>
				<category><![CDATA[TECH記事]]></category>
		<category><![CDATA[ALB]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[Lambda]]></category>
		<category><![CDATA[S3]]></category>
		<guid isPermaLink="false">https://tech-itoya.com/?p=147</guid>

					<description><![CDATA[こんにちは、とりです CloudFront や WAF が既に立っている構成では、そちらでメンテ画面を制御する方法がメジャーかと思いますが、そうでない場合 ALB で制御するケースもあるかと思います。 ALB で制御する [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>こんにちは、とりです</p>



<p>CloudFront や WAF が既に立っている構成では、そちらでメンテ画面を制御する方法がメジャーかと思いますが、そうでない場合 ALB で制御するケースもあるかと思います。</p>



<p>ALB で制御する方法もいろいろアイデアはあるかと思いますが、今回は lambda + S3 のお手軽実装でメンテページを表示させる方法について紹介したいと思います。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">構成図</a></li><li><a href="#toc2" tabindex="0">Lambda の実装</a><ol><li><a href="#toc3" tabindex="0">Lambda コード</a></li></ol></li><li><a href="#toc4" tabindex="0">その他リスナールールやS3の作成</a></li><li><a href="#toc5" tabindex="0">おまけ: メンテナンス画面の表示方法いろいろ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">構成図</span></h2>



<figure class="wp-block-image size-full"><img decoding="async" width="659" height="260" src="https://tech-itoya.com/wp-content/uploads/2024/10/tori-20241005-1.png" alt="" class="wp-image-150" srcset="https://tech-itoya.com/wp-content/uploads/2024/10/tori-20241005-1.png 659w, https://tech-itoya.com/wp-content/uploads/2024/10/tori-20241005-1-300x118.png 300w" sizes="(max-width: 659px) 100vw, 659px" /></figure>



<p>ALB のリスナーに メンテナンス用のLambdaを向いたルールを追加します。</p>



<p>普段は通常時用のリスナールールより優先順位を下げておき、メンテイン時は優先順位を上げることでメンテナンス画面を表示させます</p>



<p>ALB の操作だけでぱっとメンテインできるので、運用が楽ちんで嬉しいですね</p>



<h2 class="wp-block-heading"><span id="toc2">Lambda の実装</span></h2>



<h3 class="wp-block-heading"><span id="toc3">Lambda コード</span></h3>



<p>メインとなる lambda ロジックはこんな感じで実装をしました</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>import boto3
import os
import base64

# 環境変数からS3の情報を取得
BUCKET_NAME = os.environ[&#39;BUCKET_NAME&#39;]

s3 = boto3.client(&#39;s3&#39;)

def lambda_handler(event, context):
    try:
        # リクエストされたパスからファイル名を取得
        file_name = event.get(&#39;path&#39;, &#39;&#39;).lstrip(&#39;/&#39;)
        if not file_name:
            file_name = &#39;maintenance.html&#39;  # デフォルトのファイル名

        # S3バケットからファイルを取得
        s3response = s3.get_object(Bucket=BUCKET_NAME, Key=file_name)
        body = s3response[&#39;Body&#39;].read()
        # S3オブジェクトのメタデータからContent-Typeを取得
        content_type = s3response[&#39;ContentType&#39;]

        # content_type が text 以外の場合は base64 エンコードを挟んでから utf-8 でデコード。
        if &#39;text&#39; in content_type:
            response_body = body.decode(&#39;utf-8&#39;)
            is_base64_encoded = False
        else:
            response_body = base64.b64encode(body).decode(&#39;utf-8&#39;)
            is_base64_encoded = True

        return {
            # メンテ画面のため 正常系だが 503 を返す
            &#39;statusCode&#39;: 503,
            &#39;headers&#39;: {
                &#39;Content-Type&#39;: content_type
            },
            &#39;body&#39;: response_body,
            &#39;isBase64Encoded&#39;: is_base64_encoded
        }
    except Exception as e:
        return {
            &#39;statusCode&#39;: 500,
            &#39;body&#39;: f&quot;Error getting the file from S3: {str(e)}&quot;
        }</code></pre></div>



<p>実装のポイントとしては以下となります</p>



<ul class="wp-block-list">
<li><code>event.get('path', '').lstrip('/')</code>で HTTP リクエストからパス部分のみ取り出して、S3のファイルパスとして使用しています</li>
</ul>



<ul class="wp-block-list">
<li>content_type は S3 ファイルのメタタグから Content-type を取得しています
<ul class="wp-block-list">
<li>小ネタですが、Content-type を何も指定せずにS3にファイルアップロードした場合は python 製のライブラリによって、そのファイルの型が自動で推測されるようです(<a href="https://github.com/aws/aws-cli/blob/833716e1dae531fe8c3835c5feaa50d255c01be1/awscli/customizations/s3/utils.py#L288">aws cli</a>)</li>
</ul>
</li>



<li>text は utf-8 でそのままデコードが可能ですが、画像ファイルなどは 一度 base64 でエンコードしてから utf-8 に直すとうまく表示されました</li>
</ul>



<h2 class="wp-block-heading"><span id="toc4">その他リスナールールやS3の作成</span></h2>



<p>Lamda を作った後は上記構成図の S3 や ALB のリスナールールを作成します</p>



<p>そのあたりの作業は特に特徴はないので、参考になる記事の紹介に留めたいと思います</p>





<a rel="noopener" href="https://dev.classmethod.jp/articles/alb-listener-rule-lambda-maintenance-page" title="ALBリスナールールとLambdaだけでメンテナンスページへの切替が簡単にできる仕組みを作る | DevelopersIO" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://devio2023-media.developers.io/wp-content/uploads/2019/05/aws-lambda.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">ALBリスナールールとLambdaだけでメンテナンスページへの切替が簡単にできる仕組みを作る | DevelopersIO</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://dev.classmethod.jp/articles/alb-listener-rule-lambda-maintenance-page/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">dev.classmethod.jp</div></div></div></div></a>






<a rel="noopener" href="https://qiita.com/kizashi/items/1156e81393dcfb81a5eb" title="ALBで1025文字以上のメンテナンス画面を表示する方法 - Qiita" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-user-contents.imgix.net%2Fhttps%253A%252F%252Fcdn.qiita.com%252Fassets%252Fpublic%252Farticle-ogp-background-afbab5eb44e0b055cce1258705637a91.png%3Fixlib%3Drb-4.0.0%26w%3D1200%26blend64%3DaHR0cHM6Ly9xaWl0YS11c2VyLXByb2ZpbGUtaW1hZ2VzLmltZ2l4Lm5ldC9odHRwcyUzQSUyRiUyRnMzLWFwLW5vcnRoZWFzdC0xLmFtYXpvbmF3cy5jb20lMkZxaWl0YS1pbWFnZS1zdG9yZSUyRjAlMkY5MjMxMTQlMkYxNWQ1OTIwNWQ1MmQ2NjhmYjJmZjdhYTVmMjkwYzNhMThhNTAzNDY0JTJGbGFyZ2UucG5nJTNGMTYxMDA3OTUwMT9peGxpYj1yYi00LjAuMCZhcj0xJTNBMSZmaXQ9Y3JvcCZtYXNrPWVsbGlwc2UmYmc9RkZGRkZGJmZtPXBuZzMyJnM9NTA2MTk4YjA0MDdkMDJkY2Q1OTJmZTMyNmE5NTQyNjE%26blend-x%3D120%26blend-y%3D467%26blend-w%3D82%26blend-h%3D82%26blend-mode%3Dnormal%26s%3Db2192c45778d99f3efd88c6a65dc3d85?ixlib=rb-4.0.0&#038;w=1200&#038;fm=jpg&#038;mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk2MCZoPTMyNCZ0eHQ9QUxCJUUzJTgxJUE3MTAyNSVFNiU5NiU4NyVFNSVBRCU5NyVFNCVCQiVBNSVFNCVCOCU4QSVFMyU4MSVBRSVFMyU4MyVBMSVFMyU4MyVCMyVFMyU4MyU4NiVFMyU4MyU4QSVFMyU4MyVCMyVFMyU4MiVCOSVFNyU5NCVCQiVFOSU5RCVBMiVFMyU4MiU5MiVFOCVBMSVBOCVFNyVBNCVCQSVFMyU4MSU5OSVFMyU4MiU4QiVFNiU5NiVCOSVFNiVCMyU5NSZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZ0eHQtY29sb3I9JTIzMUUyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnR4dC1wYWQ9MCZzPTE1YzZjZmUzNTMzZmQxNDcwYWU0ZjI5MzZjODY1ZmU1&#038;mark-x=120&#038;mark-y=112&#038;blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTgzOCZoPTU4JnR4dD0lNDBraXphc2hpJnR4dC1jb2xvcj0lMjMxRTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LXBhZD0wJnM9OTI2MjBjOTk4MmM5YTJiYzE4NGFjOWUzNWIwZTdlZDI&#038;blend-x=242&#038;blend-y=480&#038;blend-w=838&#038;blend-h=46&#038;blend-fit=crop&#038;blend-crop=left%2Cbottom&#038;blend-mode=normal&#038;s=f66aa48a50b9a6f81a9a41d77defdc63" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">ALBで1025文字以上のメンテナンス画面を表示する方法 - Qiita</div><div class="blogcard-snippet external-blogcard-snippet">背景 AWSのALB（Application Load Balancer）のリスナールールを使ってメンテナンス画面を表示することは一般的ですが、ALBのリスナールールには1024文字の制限があります。 そのため、1024文字を超えるメンテナ...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://qiita.com/kizashi/items/1156e81393dcfb81a5eb" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">qiita.com</div></div></div></div></a>




<p>上記の記事の手順に加えて、 Lambda -&gt; S3 の間に、Gateway 型の VPC エンドポイントを噛ませておけると、S3 のアウトバウンドの転送料金がかからなくなるため、ある程度のトラフィック量が見込まれる場合は入れておくといいかもしれません。</p>





<a rel="noopener" href="https://repost.aws/ja/questions/QU71ng4VdySYaZa8B44TrVJA/ec2-outbound-data-transfer-cost-to-s3-gateway-endpoint?sc_ichannel=ha&#038;sc_ilang=en&#038;sc_isite=repost&#038;sc_iplace=hp&#038;sc_icontent=QU71ng4VdySYaZa8B44TrVJA&#038;sc_ipos=13" title="ERROR: The request could not be satisfied" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Frepost.aws%2Fja%2Fquestions%2FQU71ng4VdySYaZa8B44TrVJA%2Fec2-outbound-data-transfer-cost-to-s3-gateway-endpoint%3Fsc_ichannel%3Dha%26sc_ilang%3Den%26sc_isite%3Drepost%26sc_iplace%3Dhp%26sc_icontent%3DQU71ng4VdySYaZa8B44TrVJA%26sc_ipos%3D13?w=160&#038;h=90" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="160" height="90" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">ERROR: The request could not be satisfied</div><div class="blogcard-snippet external-blogcard-snippet"></div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://repost.aws/ja/questions/QU71ng4VdySYaZa8B44TrVJA/ec2-outbound-data-transfer-cost-to-s3-gateway-endpoint?sc_ichannel=ha&#038;sc_ilang=en&#038;sc_isite=repost&#038;sc_iplace=hp&#038;sc_icontent=QU71ng4VdySYaZa8B44TrVJA&#038;sc_ipos=13" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">repost.aws</div></div></div></div></a>




<h2 class="wp-block-heading"><span id="toc5">おまけ: メンテナンス画面の表示方法いろいろ</span></h2>



<p>冒頭で軽く触れた通り、ALB でメンテナンス画面を表示させるにはいろいろな実装方法があります。</p>



<p>個人的に方法を比較した際のメモを残しておきます。</p>



<p>今回はサービスの性質上あまり大量アクセスを見込んでいなかったため、実装のお手軽さを重視して Lambda を採用してみました。トラフィックがある程度見込まれるサービスの場合は、Cloudfront 経由がなんだかんだ綺麗なのかもなという印象でした。</p>



<p><span class="marker-under">1.ALBの固定レスポンスで返す</span></p>



<ul class="wp-block-list">
<li>参考記事: <a href="https://www.netassist.ne.jp/techblog/29666/">https://www.netassist.ne.jp/techblog/29666/</a></li>



<li>ALB 単体で完結するため、実装としては一番楽だしコストも安い</li>



<li>別ファイルのCSSや画像の読み込みはできない</li>



<li>レスポンスの内容は1024文字までに制限されるのでリッチなページは返せない</li>
</ul>



<p><span class="marker-under">2.Cloudfrontを経由してメンテ画面を表示</span></p>



<ul class="wp-block-list">
<li>参考記事:<a href="https://techblog.nhn-techorus.com/archives/21488">https://techblog.nhn-techorus.com/archives/21488</a></li>



<li>AWS上で完結させる要件だとおそらく一番メジャーな実装方法</li>



<li>CDNキャッシュが効く分、早くレスポンスが返る嬉しさがある</li>



<li>CDNキャッシュされて、S3へのリクエスト量が節約できるので若干のコストメリットがある</li>



<li>この中だと実装が比較的重め (IaC してる場合だと設定値多いリソースなので特に)</li>
</ul>



<p><span class="marker-under">3.Privatelinkを経由してメンテ画面を表示</span></p>



<ul class="wp-block-list">
<li>参考記事:<a href="https://aws.amazon.com/jp/blogs/news/hosting-internal-https-static-websites-with-alb-s3-and-privatelink/">https://aws.amazon.com/jp/blogs/news/hosting-internal-https-static-websites-with-alb-s3-and-privatelink/</a></li>



<li>VPC エンドポイント追加して向けるだけなので実装はかなり楽</li>



<li>インターフェース型 VPC エンドポイントを使うので、コストは結構かかっちゃう</li>
</ul>



<p><span class="marker-under"><strong>4.Lambda を経由してメンテ画面を表示 (今回の方法)</strong></span></p>



<ul class="wp-block-list">
<li>参考記事: <a href="https://dev.classmethod.jp/articles/alb-listener-rule-lambda-maintenance-page/">https://dev.classmethod.jp/articles/alb-listener-rule-lambda-maintenance-page/</a></li>



<li>実装はまあまあお手軽</li>



<li>lambda ロジックの管理コストがかかる
<ul class="wp-block-list">
<li>とはいえ layer も不要で、大分軽微な実装なので運用負荷はそんな高くないはず</li>
</ul>
</li>
</ul>
		<div class="wpulike wpulike-heart " ><div class="wp_ulike_general_class wp_ulike_is_restricted"><button type="button"
					aria-label="いいねボタン"
					data-ulike-id="147"
					data-ulike-nonce="32f81faa61"
					data-ulike-type="post"
					data-ulike-template="wpulike-heart"
					data-ulike-display-likers=""
					data-ulike-likers-style="popover"
					class="wp_ulike_btn wp_ulike_put_image wp_post_btn_147"></button><span class="count-box wp_ulike_counter_up" data-ulike-counter-value="+1"></span>			</div></div>
	]]></content:encoded>
					
					<wfw:commentRss>https://tech-itoya.com/alb-s3-lambda-%e3%81%a7%e7%94%bb%e5%83%8f%e3%82%84%e3%83%87%e3%82%b6%e3%82%a4%e3%83%b3%e5%90%ab%e3%82%80%e3%81%a1%e3%82%87%e3%81%a3%e3%81%a8%e3%83%aa%e3%83%83%e3%83%81%e3%81%aa%e3%83%a1%e3%83%b3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
