こんにちは。middleです。
いきなり言い訳で恐縮ですが、あんまりよいネタを思いつかなかったので、「最近私が知ったAWSの話シリーズ」をやりたいと思います。
★今回のお題
ELBのログ保管(&懲りずにCloudFormationのあれやこれ)
★背景
CloudFormationでELBを構築しようとしていたら、「S3Bucket validation transient issue」というエラーが出てスタック作成が失敗してしまいました。
・ELBテンプレート内でS3に関係している部分は、アクセスログの保管先としてS3バケットを指定しているところのみです。
★いきなり結果
何故なのかわからなかったので、伝家の宝刀サポート問い合わせの結果、以下回答をいただきました。
・「S3Bucket validation transient issue」というエラーが、CloudFormationを利用しELBのログを有効化する際発生する場合、S3バケットへログを保存するためのアクセスが行えない可能性があります。
・S3バケットのデフォルト暗号化機能で「AWS-KMS」を利用していると、ELBからのアクセスログが出力できません。
・もし該当S3バケットでAWS-KMS暗号化を利用している場合は、S3で管理された暗号化キーによるサーバー側の暗号化(SSE-S3)等の利用を検討してください。
※一部抜粋&改変してます。
私がログ保管先として指定していたS3バケットはAWS-KMSを利用して暗号化しており、それが原因だということがわかりました。
SSE-S3で暗号化したバケットを新たに作成し、それをログ保管先としたところ、スタック作成が成功しました!
ということで、以下ELBをCloudFormationで構築する場合のポイントをまとめました!
★①S3バケット暗号化(任意)
もちろん暗号化は必須ではないのでここはお任せですが、上述の通り、AWS-KMSは利用しないようにしましょう。
★②S3バケットポリシーでELBに権限許可
ほかのAWSサービス(例えばConfigやCloudWatchLogsなど)ですと、Principalの部分にサービス名を書くのですが、ELBの場合はリージョン毎に特定のアカウントを指定します。
そしてリソースは特定のプレフィックスを指定します。
■参考:
Classic Load Balancer のアクセスログの有効化 – Elastic Load Balancing
Application Load Balancer のアクセスログ – Elastic Load Balancing
※NLBはアクセスログ出力ができないそうなので、気にしません。
今回は東京リージョンでしか使用しないので、テンプレートでは以下のように書いてみました。
BucketPolicy:
Type: AWS::S3::BucketPolicy
Properties:
Bucket: !Ref S3BucketForElbLogs
PolicyDocument:
Statement:
– Sid: ELBLog
Effect: Allow
Principal:
AWS:
– “582318560864“
Action:
– “s3:PutObject”
Resource: !Join
– “”
– – !GetAtt S3BucketForElbLogs.Arn
– “/*/AWSLogs/”
– !Ref AWS::AccountId
– “/*”
この582318560864というのが、東京リージョンのELBアカウントIDです。
複数リージョンで利用する場合は、リージョンによってアカウントIDを書き換えるようなテンプレートにすると便利ですね。諸先輩方がサンプル書かれてるので探してみてください!
そしてリソースとして指定するのは以下です。テンプレートだと青字部分です。
arn:aws:s3:::bucket/prefix/AWSLogs/aws-account-id/*
!GetAtt S3BucketForElbLogs.Arnというのが「arn:aws:s3:::bucket」部分(S3バケットのARN)に該当します。
「prefix」は固定しなくてよいかと思ったので「*」にしてみました。
また、自分のアカウントIDは「!Ref AWS::AccountId」と表記することで呼び出すことができます。
★③アクセスログ有効化
ここまでできたら、ELB構築のテンプレート部分でアクセスログ有効化をします。
LoadBalancerAttributes:
– Key: access_logs.s3.enabled
Value: true
– Key: access_logs.s3.bucket
Value: !Ref S3BucketForElbLogs
– Key: access_logs.s3.prefix
Value: MyELB1
※こちらはALB仕様です。
AccessLoggingPolicy:
Enabled: true
S3BucketName: !Ref S3BucketForElbLogs
S3BucketPrefix: MyELB1
※こちらはCLB仕様です。
というわけで以上でELBのアクセスログ有効化にまつわるあれやこれが完了です!
お疲れ様でした 🙂