新ネットワークスペシャリスト道

ネットワーク、セキュリティ、何の話?

【AWS 100日チャレンジ - 63日目】Lambda による S3 アップロード時の自動画像変換(またはログ記録)

AWSの知識を血肉にするための「AWS 100日チャレンジ」の63日目です。

 

AWS 100日チャレンジの記事を書く上でのルール

・100日連続アウトプット!

・継続が第一、クオリティは第二

・「社会人のリアル」を忘れない(持続可能な完走を目指す)

・コアな学習に全集中!
 テーマとするサービス以外は、CloudFormationや構築済みの資産をフル活用。効率よく「核心」を突き詰めます。

課題

Lambda による S3 アップロード時の自動画像変換(またはログ記録)

実施 

1.S3バケット作成

変換元と変換先のバケット作成

変換元:xxx-source-image-backet

変換先:xxx-after-image-bakchet

バケット名だけ入力しあとはデフォルト設定で作成。

 

2.IAM ロールの作成

IAMロール名:xxx-imagechange-role

許可ポリシー:

 AmazonS3FullAccess

 AWSLambdaBasicExecutionRole

 

3.Lambda 関数の作成

lambda名:xxx-imagechange-function

関数を作成 :一から作成

そのほかはデフォルト。

 

ソースコードは以下。

import boto3
import os
import sys
import uuid
from PIL import Image

s3_client = boto3.client('s3')

def lambda_handler(event, context):
    # イベントからバケット名とファイル名を取得
    source_bucket = event['Records'][0]['s3']['bucket']['name']
    key = event['Records'][0]['s3']['object']['key']
    
    # ログ記録
    print(f"File uploaded: {key} in bucket {source_bucket}")

    # 出力先バケットの設定
    dest_bucket = "xxx-after-image-bakchet"
    download_path = f"/tmp/{uuid.uuid4()}{key}"
    upload_path = f"/tmp/resized-{key}"

    # S3から画像をダウンロード
    s3_client.download_file(source_bucket, key, download_path)

    # 画像リサイズ処理
    with Image.open(download_path) as image:
        image.thumbnail*1 # 例:最大128pxにリサイズ
        image.save(upload_path)

    # S3にアップロード
    s3_client.upload_file(upload_path, dest_bucket, f"resized-{key}")
    
    print(f"Successfully resized and uploaded to {dest_bucket}")

 

手順2で作成したロールをlambdaに設定

 

 

トリガーを追加。

 

 

一般設定タブをクリック。

 

メモリを512MBにして、タイムアウトを1分に設定。

 

 

Lambda の標準環境には画像処理ライブラリ Pillow が入っていないため、外部から持ち込む必要がある。

そのためにレイヤーが必要。

 

レイヤーを事前に登録

 

レイヤーの追加をクリック。

 

今日はここまで、明日に続けます。

 

*1:128, 128

【AWS 100日チャレンジ - 62日目】ANS-C01の下準備

AWSの知識を血肉にするための「AWS 100日チャレンジ」の62日目です。

連休中、今日は雨。

昨日は遠出したので今日は家でゆったり。

 

AWS 100日チャレンジの記事を書く上でのルール

・100日連続アウトプット!

・継続が第一、クオリティは第二

・「社会人のリアル」を忘れない(持続可能な完走を目指す)

・コアな学習に全集中!
 テーマとするサービス以外は、CloudFormationや構築済みの資産をフル活用。効率よく「核心」を突き詰めます。

 

SOA合格したので次は何を受けようかと考えていたんですが、

ネットワークにより強くなりたいと思い、

業務に一番近いANS-C01を受けることにします。

ANS-C01は受験者が少ないのか教材が少ない。

公式のサブスクリプションに教科書があったのでそれでなんとかなるか。。。

議事問題はudemyで受けるとして、会社の資格手当の関係もあるし早めに受けたいです。

 

↓AWS公式にあった学習プランでとりあえずインプット。

 

【AWS 100日チャレンジ - 61日目】CloudFormationのヘルパースクリプトを試す(cfn-initとcfn-signal)

AWSの知識を血肉にするための「AWS 100日チャレンジ」の61日目です。

今日は陶器市に行ってきました。

安くて魅力的な器やコップがたくさんあって、買うのにすごく迷いました。

いいビアグラス(陶器)が変えて満足です。

 

AWS 100日チャレンジの記事を書く上でのルール

・100日連続アウトプット!

・継続が第一、クオリティは第二

・「社会人のリアル」を忘れない(持続可能な完走を目指す)

・コアな学習に全集中!
 テーマとするサービス以外は、CloudFormationや構築済みの資産をフル活用。効率よく「核心」を突き詰めます。

課題

CloudFormationのヘルパースクリプトを試す(cfn-initとcfn-signal)

実施 

まずヘルパースクリプトは以下種類があります。

今回は、cfn-initcfn-signalを試してみます。

 

1.YAMLファイルを定義する

cfn-init を使用すると、

UserData にズラズラと yum install を書くよりも、

「CloudFormationらしい」構成になり、可読性が格段に上がります。

 

CloudFormationに読み込ませるYAML定義は以下です。

cfn-initの部分

Resources:
  LinuxSvA:
    Type: AWS::EC2::Instance
    Metadata:
      AWS::CloudFormation::Init:
        config:
          packages:
            yum:
              httpd: []
          files:
            "/var/www/html/index.html":
              content: "Hello from CloudFormation Helper Scripts!"
              mode: "000644"
              owner: "root"
              group: "root"
          services:
            sysvinit:
              httpd:
                enabled: "true"
                ensureRunning: "true"

cfn-signalの部分

Properties:
      # ... その他のプロパティ ...
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash -xe
          # 最新のヘルパースクリプトに更新
          yum install -y aws-cfn-bootstrap
          
          # cfn-init の実行
          /opt/aws/bin/cfn-init -v \
            --stack ${AWS::StackName} \
            --resource LinuxSvA\
            --region ${AWS::Region}

          # 完了をシグナルで送信 (WaitConditionHandleがある場合)
          /opt/aws/bin/cfn-signal -e $? \
            --stack ${AWS::StackName} \
            --resource LinuxSvA\
            --region ${AWS::Region}

 

スタックを上記YAMLを指定して作成する。

2.動作確認

Teratermdeリモートログイン。

以下コマンドにてHTTPDがインストールされているか確認。

systemctl status httpd

 

 

【AWS 100日チャレンジ - 60日目】SOA(AWS Certified CloudOps Engineer – Associate)合格

AWSの知識を血肉にするための「AWS 100日チャレンジ」の60日目です。

 

今日、SOA(AWS Certified CloudOps Engineer – Associate)受験してきました。

13:00に受験して、21:00ごろに合格のメール通知が来ました!

久々の資格合格うれしい。

 

【合格バッチ】

https://www.credly.com/users/username.8c5fcc88/badges#credly

 

全冠をめざして、次は、

AIF-C01かDVA-C02を受ける予定です。

 

AWS 100日チャレンジの記事を書く上でのルール

・100日連続アウトプット!

・継続が第一、クオリティは第二

・「社会人のリアル」を忘れない(持続可能な完走を目指す)

・コアな学習に全集中!
 テーマとするサービス以外は、CloudFormationや構築済みの資産をフル活用。効率よく「核心」を突き詰めます。

 

 

【AWS 100日チャレンジ - 59日目】S3インベントリを使用して必要なレポートを生成する

AWSの知識を血肉にするための「AWS 100日チャレンジ」の59日目です。

明日とうとうSOA試験を受けます。

今のところ、AWS関連は2つ持っています。

・AWS Certified Cloud Practitioner

・AWS Certified Solutions Architect - Associate

アーキテクトな資格しかなかったので、実運用的な資格が欲しくてSOAを受けることにしました。

AWS運用は経験ないので初めて知ることも多かったです。

 

AWS 100日チャレンジの記事を書く上でのルール

・100日連続アウトプット!

・継続が第一、クオリティは第二

・「社会人のリアル」を忘れない(持続可能な完走を目指す)

・コアな学習に全集中!
 テーマとするサービス以外は、CloudFormationや構築済みの資産をフル活用。効率よく「核心」を突き詰めます。

課題

S3インベントリを使用して必要なレポートを生成する

実施 

1.ソースバケットと宛先バケットの作成

ソースバケットに対するインベントリレポートを保管するバケットを作成。

ソースバケット:xxx-source-bakect

宛先バケット:xxx-inventory-report-backet

 

宛先バケットのバケットポリシーに以下追加。

ソースバケットから宛先バケットへ書き込みできるようにする。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowInventoryReportsToPutObjects",
            "Effect": "Allow",
            "Principal": {
                "Service": "s3.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::xxx-inventory-report-backet/*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceArn": "arn:aws:s3:::xxx-source-bakect"
                }
            }
        }
    ]
}

 

2.S3 インベントリの設定手順

ソースバケットを選択し、管理タブをクリック。

インベントリ設定からインベントリ設定の作成をクリック。

インベントリ名:xxx-inventry

レポートの詳細は以下のように

送信先バケット:このアカウント

送信先:xxx-inventory-report-backet

出力形式:CSV

追加のメタデータオプションはすべてを選択。

 

3.動作確認

最初のレポートが生成されるまでには、データの量により最大 48 時間かかる場合がある、とのことなので、明日確認してみます。

 

なにも保存されないと、レポートも出しようがないので、適当なファイルをソースバケットに保存しておきます。

 

2026/5/4 後日

インベントリレポートが保存されているフォルダを確認。

何種類かのファイルが保存されていました。

 

以下の意味があるようです。

・日付名のフォルダ

 インベントリが実行された「実行日(タイムスタンプ)」ごとのフォルダ

・data/ フォルダ

 レポートの実データ

hive/ フォルダ

 Amazon Athena などの分析ツールでデータを読み込みやすくするためのフォルダ

 

今回のAWS利用料金

S3 は主に「ストレージ」「リクエスト」「データ転送」の 3 つの軸で課金。

1.ストレージ

 S3 標準 (Standard)    約 $0.025 (約 3.8円) / 1GB

2.リクエスト

 書き込み (PUT, COPY, POST, LIST): 1,000 件あたり $0.0047
 読み取り (GET, SELECT): 1,000 件あたり $0.00037

3.データ転送

 受信 (インターネット → S3): 無料

 送信 (S3 → インターネット): 最初の 100GB/月までは無料。それを超えると $0.114/GB(約 17円/GB)

 

【AWS 100日チャレンジ - 58日目】Amazon EC2 が新規起動されたときに、Eメール通知を行う

AWSの知識を血肉にするための「AWS 100日チャレンジ」の58日目です。

今日もギリギリ投稿です。

 

AWS 100日チャレンジの記事を書く上でのルール

・100日連続アウトプット!

・継続が第一、クオリティは第二

・「社会人のリアル」を忘れない(持続可能な完走を目指す)

・コアな学習に全集中!
 テーマとするサービス以外は、CloudFormationや構築済みの資産をフル活用。効率よく「核心」を突き詰めます。

課題

Amazon EC2 が新規起動されたときに、Eメール通知を行う

実施 

SNSトピックはすでに作成済みのものを使用してサブスクライブします。

 

1.EventBridgeの設定

Amazon EventBridgeコンソール > バス > ルール > 「ルールの作成」をクリック。

ルール名:XXX-Notify-EC2-Start

AWSサービス::EC2

イベントタイプ::EC2 Instance State-change Notification

 

イベントパターン(フィルター)をクリックして以下入力。

{
  "source": ["aws.ec2"],
  "detail-type": ["EC2 Instance State-change Notification"],
  "detail": {
    "state": ["running"]
  }
}

 

次にターゲット(SNS)を設定。

 

作成をクリック。

 

2.動作確認

CloudFundationからEC2を作成する。

メールが届いてました。

今回のAWS利用料金

EventBridge の「AWS サービスから発生するイベント」の処理は 無料。

今回の構築は、EC2の状態変化でAWSサービスイベントになり無料。

 

 

【AWS 100日チャレンジ - 57日目】AWS Systems ManagerのState ManagerでEC2起動時に特定のソフトをインストールする

AWSの知識を血肉にするための「AWS 100日チャレンジ」の57日目です。

昨日、投稿記事を作成中にブルーバックが発生し投稿できませんでした。

昨日分のアップ。

 

AWS 100日チャレンジの記事を書く上でのルール

・100日連続アウトプット!

・継続が第一、クオリティは第二

・「社会人のリアル」を忘れない(持続可能な完走を目指す)

・コアな学習に全集中!
 テーマとするサービス以外は、CloudFormationや構築済みの資産をフル活用。効率よく「核心」を突き詰めます。

課題

AWS Systems ManagerのState ManagerでEC2起動時に特定のソフトをインストールする

実施 

1.ステートマネージャを開く

AWS Systems Manager
 >ステートマネージャー
  >Create association

AWS-RunShellScriptを選択。

パラメータに以下コマンドを入力。

sudo yum install -y vsftpd
sudo systemctl enable vsftpd
sudo systemctl status vsftpd

ターゲットをEC2にしようとしたのですが、一覧にでてきません。

シャットダウンしているから起動させてみると表示されました。

スケジュールはなし。

コンプライアンスはミディアム

作成を押してみる。

作成と同時に実行されている。

 

2.動作確認

rpm -qa vsftpd

 

今回のAWS利用料金

SystemManagerのStateManagerは利用料は発生しません。