AWS

Serverless 構成で lambda ローカルデバッグ用に AWS SAM CLI を使用する

  • POST
Serverless 構成で lambda ローカルデバッグ用に AWS SAM CLI を使用する方法を調査したものを備忘録として残しておく 環境 Infrastructure: AWS lambda: nodejs(20.X) Secret Manager RDS: PostgreSQL AWS API Gateway API Key あり AWS SAM CLI Docker Compose API 仕様書 OpenAPI 3.0 AWS SAM 環境について 必要なファイルの内、重要な部分のみ記載 フォルダ構成 ├── layers/ │ ├── package.json │ └── pg-layer.zip │ ├── scripts/ │ ├── create-pg-layer.sh │ ├── init-localstack.sh │ └── local-secret.json │ ├── .env ├── docker-compose.yml └── template.yaml 実際のファイル AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Globals: Function: Runtime: nodejs20.x Timeout: 30 MemorySize: 128 Environment: Variables: DB_NAME: !Sub "${DB_NAME}" DB_HOST: !Sub "${DB_HOST}" DB_USER: !Sub "${DB_USER}" DB_PORT: !Sub "${DB_PORT}" SECRET_NAME: !Sub "${SECRET_NAME}" IS_LOCAL: !Sub "${IS_LOCAL}" NODE_ENV: !Sub "${NODE_ENV}" AWS_ENDPOINT_SECRETS_MANAGER: !Sub "${AWS_ENDPOINT_SECRETS_MANAGER}" AWS_REGION: !Sub "${AWS_REGION}" AWS_ACCESS_KEY_ID: !Sub "${AWS_ACCESS_KEY_ID}" AWS_SECRET_ACCESS_KEY: !Sub "${AWS_SECRET_ACCESS_KEY}" AWS_SDK_LOAD_CONFIG: !Sub "${AWS_SDK_LOAD_CONFIG}" AWS_STS_REGIONAL_ENDPOINTS: !Sub "${AWS_STS_REGIONAL_ENDPOINTS}" AWS_NODEJS_CONNECTION_REUSE_ENABLED: !Sub "${AWS_NODEJS_CONNECTION_REUSE_ENABLED}" Resources: # API Gateway LocalApi: Type: AWS::Serverless::Api Properties: StageName: local Cors: AllowMethods: "'*'" AllowHeaders: "'*'" AllowOrigin: "'*'" Auth: ApiKeyRequired: true DefinitionBody: Fn::Transform: Name: AWS::Include Parameters: Location: ./docs/open_api.yml # Parameterized OpenAPI 3.0 file # Lambda Function GetUserDetailFunction: Type: AWS::Serverless::Function Properties: CodeUri: functions/getUserDetail/ Handler: index.handler Layers: - !Ref PgLayer Events: ApiEvent: Type: Api Properties: RestApiId: !Ref LocalApi Path: /users/{userId} Method: GET PgLayer: Type: AWS::Serverless::LayerVersion Properties: LayerName: pg-layer Description: PostgreSQL client for Node.js ContentUri: layers/pg-layer.zip CompatibleRuntimes: - nodejs20.x services: postgres: image: postgres:13 container_name: test-postgres environment: POSTGRES_DB: ${DB_NAME} POSTGRES_USER: ${DB_USER} POSTGRES_PASSWORD: ${DB_PASSWORD} ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 5 localstack: image: localstack/localstack:latest ports: - "4566:4566" # LocalStack Gateway - "4510-4559:4510-4559" # External services port range environment: - DEBUG=${DEBUG} - DOCKER_HOST=${DOCKER_HOST} - LAMBDA_EXECUTOR=${LAMBDA_EXECUTOR} - PERSISTENCE=${PERSISTENCE} - SERVICES=${SERVICES} - AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION} - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} volumes: - "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack" - "/var/run/docker.sock:/var/run/docker.sock" - "./scripts/init-localstack.sh:/etc/localstack/init/ready.d/init-localstack.sh" - "./scripts/local-secret.json:/etc/localstack/local-secret.json" volumes: postgres_data: #!/bin/bash # LocalStackのエンドポイント ENDPOINT="http://localhost:4566" # シークレット値を外部ファイルから読み込む SECRET_STRING=$(cat /etc/localstack/local-secret.json) # シークレットの作成 aws --endpoint-url=$ENDPOINT secretsmanager create-secret \ --name local-secret \ --description "Local development secret" \ --secret-string "$SECRET_STRING" echo "LocalStack secrets initialized" { "password": "postgres" } #!/bin/bash set -e LAYER_DIR="layers/pg-layer" ZIP_FILE="layers/pg-layer.zip" mkdir -p "$LAYER_DIR/nodejs" cp layers/package.json "$LAYER_DIR/nodejs/package.json" cd "$LAYER_DIR/nodejs" npm install --production cd ../../.. rm -f "$ZIP_FILE" cd "$LAYER_DIR" zip -r "../../$ZIP_FILE" . cd ../../ echo "pg-layer の作成が完了しました: $ZIP_FILE" rm -rf "$LAYER_DIR" # Only used for local debugging # DB DB_NAME=test_db DB_HOST=host.docker.internal DB_USER=postgres DB_PORT=5432 DB_PASSWORD=postgres # SecretsManager SECRET_NAME=local-secret # Lambda IS_LOCAL=true NODE_ENV=local AWS_ENDPOINT_SECRETS_MANAGER=http://host.docker.internal:4566 AWS_REGION=ap-northeast-1 AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test AWS_SDK_LOAD_CONFIG=1 AWS_STS_REGIONAL_ENDPOINTS=regional AWS_NODEJS_CONNECTION_REUSE_ENABLED=1 # LocalStack DEBUG=1 DOCKER_HOST=unix:///var/run/docker.sock LAMBDA_EXECUTOR=docker PERSISTENCE=1 SERVICES=secretsmanager AWS_DEFAULT_REGION=ap-northeast-1 LOCALSTACK_VOLUME_DIR=./volume 使用方法 実施手順 docker-compose up -d Copy the DB in the Dev environment If the Layer is updated, do the following ./scripts/create-pg-layer.sh sam local start-api シークレットマネージャーに値が追加された場合 ローカルデバッグでは localstack を使用する

AWS ルートユーザに設定されている MFA が不明な場合のログイン方法

  • POST
AWS ルートユーザに設定されている MFA が不明な場合のログイン方法を備忘録として残しておく 状況 ルートユーザ メールアドレス: 把握 パスワード: 不明 MFA: 故障 or 紛失 実際の手順 公式の手順 を参考に行う 事前作業 公式の手順 を参考に行う IAM ユーザ認証情報を使用して、更新対象の AWS アカウントにログイン AWS Billing and Cost Management > Account を選択 [Contact Information] の横にある [Edit]を選択 アカウントに関連付けられている電話番号を更新 ※電話番号の国コードが正しく、余分なスペースが含まれていないことを確認 [Update]を選択 作業手順 AWS アカウントのルートユーザーの E メールアドレスを使用してサインインする [Root user sign in]ページで、ルートアカウントのパスワードを入力する [Amazon Web Services Sign In With Authentication Device]ページで、[Troubleshoot MFA? Click here] を選択 [Troubleshoot Your Authentication Device] ページで、[Sign In using alternative factors]を選択 [Step 1: Email address verification]で、メールアドレスが正しいことを検証し、[Send verification email]を選択 件名が「AWS Email Verification」である AWS からの E メールで、[Verify your email address]を選択 => 検証プロセスの「ステップ 2」ページが表示 [Step 2: Phone number verification]で、表示されている電話番号が正しいことを確認し、[Call me now]を選択 AWS からの電話に応答し、電話のキーパッドを使用して、デバイスの画面に表示される 6 桁の検証コードを送信 [Step 3: Sign In]で、[Sign in to the console]を選択 => [Security Credentials]に自動的にリダイレクトされる リセットする MFA デバイスの横にある [Deactivate]を選択 [Activate MFA] を選択して MFA デバイスを追加

ShellScript で MFA 認証設定済の IAM を使用して S3 に画像をアップロードする方法

  • POST
ShellScript で MFA 認証設定済の IAM を使用して S3 に画像をアップロードする方法について調査した結果を備忘録として残しておく 環境 OS: MacOS aws-mfa をインストールして登録済 aws-mfa 設定を参照 aws-mfa 設定 通常の aws profile を設定 1 で設定した «profile 名»-long-term で Profile を設定 追加で ~/.aws/credentials に以下を設定 [<<profile 名>>-long-term] aws_mfa_device = <<arn:aws:iam::*:mfa/${aws:username}>> フォルダ構成 ./ ├── img/ │ └── image_001.png └── upload_image.sh 実際のコード <<AWS Profile Prefix>> 部分は実際の環境に応じて書き換える #!/bin/sh # Shared AWS_PROFILE_PREFIX=<<AWS Profile Prefix>> IMAGE_UPLOAD_DIR=img read -p "Which environment connect to? (dev/stg/prd): " input_environment # Convert to uppercase environment=$(echo "${input_environment}" | tr '[:lower:]' '[:upper:]') echo "【Start Processing】$(date "+%Y/%m/%d %H:%M:%S")" >> ${LOG_FILE} 2>&1 # Check the environment case "${input_environment}" in "dev" | "stg" | "prd") echo "Connecting to ${environment} environment..." >> ${LOG_FILE} 2>&1 # AWS MFA Authentication aws-mfa --profile=${AWS_PROFILE_PREFIX}-${input_environment} >> ${LOG_FILE} 2>&1 # Set environment variables AWS_PROFILE=$(eval "echo \${AWS_PROFILE_PREFIX}-${input_environment}") AWS_S3_IMAGE_UPLOAD_DIR=$(eval "echo s3-bucket-${input_environment}-to/path/");; *) echo "Please enter the correct environment." >> ${LOG_FILE} 2>&1 echo "【End Processing】$(date "+%Y/%m/%d %H:%M:%S")" >> ${LOG_FILE} 2>&1 exit;; esac echo "【Start Upload Image】$(date "+%Y/%m/%d %H:%M:%S")" >> ${LOG_FILE} 2>&1 # Remove .DS_Store find . -name ".DS_Store" | xargs rm -f # Upload images to S3 aws s3 cp ./${IMAGE_UPLOAD_DIR} s3://${AWS_S3_IMAGE_UPLOAD_DIR} --profile=${AWS_PROFILE} --recursive >> ${LOG_FILE} 2>&1 echo "【End Upload Image】$(date "+%Y/%m/%d %H:%M:%S")" >> ${LOG_FILE} 2>&1 echo "【End Processing】$(date "+%Y/%m/%d %H:%M:%S")" >> ${LOG_FILE} 2>&1