カテゴリー: tech

  • Understanding PHP Version Availability in Ubuntu Containers

    Understanding PHP Version Availability in Ubuntu Containers

    Introduction

    When working with Docker containers based on Ubuntu, one might encounter limitations regarding the availability of PHP versions. This blog post explores these limitations, specifically between Ubuntu 18.04 and Ubuntu 20.04 containers, and provides insights into how you can successfully manage PHP installations within these environments.

    Background

    PHP is a widely-used open-source general-purpose scripting language that is especially suited for web development. The availability of different PHP versions in Docker containers can significantly affect your development and deployment processes. Recently, I encountered a situation that necessitated a deeper dive into which PHP versions are installable on different Ubuntu containers.

    The Discovery Process

    Initially, I attempted to install PHP versions 7.3 and above in a Docker container based on ubuntu:18.04. Despite my efforts and even after adding the popular Ondřej Surý PPA, I was unable to install PHP versions higher than 7.2. This limitation posed a significant challenge, as many of my projects required at least PHP 7.3 due to various dependencies and features introduced in later PHP versions.

    Experimenting with Ubuntu 18.04

    Using the ubuntu:18.04 container, I attempted to install PHP 7.3 and 8.0 by leveraging the following commands:

    sudo add-apt-repository ppa:ondrej/php
    sudo apt-get update
    sudo apt-get install php7.3

    However, I encountered the following issue:

    E: Unable to locate package php7.3
    E: Couldn't find any package by glob 'php7.3'
    E: Couldn't find any package by regex 'php7.3'

    Switching to Ubuntu 20.04

    Prompted by the challenges faced with ubuntu:18.04, I decided to switch my Docker container to ubuntu:20.04. After applying the same steps, I was pleasantly surprised to find that I could successfully install PHP versions 7.3, 7.4, and even PHP 8.0 without any issues.

    Analysis

    This experience highlighted a crucial aspect of working with Docker and Ubuntu containers – the base image significantly impacts the availability of software packages. Ubuntu 18.04, being an older LTS release, does not natively support PHP versions higher than 7.2 without additional, sometimes complex, configurations. In contrast, Ubuntu 20.04, a more recent LTS version, has out-of-the-box support for newer PHP versions, reflecting the advancements in software compatibility and availability.

    Conclusion

    For developers and DevOps engineers working with PHP in Docker environments, understanding the relationship between the base container image and software package availability is crucial. If you’re planning to use PHP versions 7.3 or newer, opting for an ubuntu:20.04 container would be the more straightforward and efficient choice.

    This exploration not only solved my immediate problem but also served as a valuable reminder of the importance of keeping both software and knowledge up to date. I hope sharing this experience helps others navigate similar challenges in their development workflows.

    Recommendations

    • Always check the PHP version compatibility with your chosen Ubuntu container version before starting your project setup.
    • Consider upgrading your Docker container to a newer Ubuntu version if you require support for newer PHP versions.
    • Stay informed about the PHP versions supported by Ubuntu releases to ensure smooth development and deployment processes.
  • MSALを使ってOneDriveにユーザー代理でアクセスする

    MSALを使ってOneDriveにユーザー代理でアクセスする

    はじめに

    Microsoft Graph APIを使用すると、Microsoft 365のデータにアクセスできます。この記事では、Microsoft Authentication Library (MSAL) を使用してOneDriveにユーザー代理でアクセスする方法と、遭遇したいくつかの問題の解決方法を紹介します。

    OneDriveへのアクセス

    MSALを用いたアクセストークンの取得

    まず、MSALを使用してアクセストークンを取得します。以下の例では、ユーザーネームとパスワードフローを用いています。

    import msal
    
    def acquire_token_by_username_password():
        client_id = "--クライアントID--"
        tenant = "--テナント名またはID--"
    
        authority_url = f'https://login.microsoftonline.com/{tenant}'
        app = msal.PublicClientApplication(client_id=client_id, authority=authority_url)
        return app.acquire_token_by_username_password(
            username=settings.get('user_credentials', 'username'),
            password=settings.get('user_credentials', 'password'),
            scopes=["https://graph.microsoft.com/.default"])
    
    
    

    GraphClientを使用してOneDriveのデータにアクセス

    トークンを取得したら、GraphClientを使用してOneDriveにアクセスします。

    from office365.graph_client import GraphClient
    
    client = GraphClient(acquire_token_by_username_password)
    drive_items = client.me.drive.shared_with_me().execute_query()
    for item in drive_items:
        print(f"Drive Item url: {item.web_url}")
    
    
    

    遭遇した問題とその解決方法

    認証エラーの解決

    認証時にinvalid_clientというエラーが発生した場合、クライアント秘密キーまたは証明書が正しくない可能性があります。ConfidentialClientApplicationクラスを使用して、証明書を用いた認証を試みます。

    import os
    import msal
    
    cert_path = '/path/to/your/certificate.pem'
    with open(cert_path, 'r') as f:
        private_key = f.read().strip()
    
    authority_url = f'https://login.microsoftonline.com/{tenant}'
    app = msal.ConfidentialClientApplication(
        client_id=client_id,
        client_credential={"private_key": private_key, "thumbprint": thumbprint},
        authority=authority_url)
    
    

    タイプエラーの解決

    TypeError: 'dict' object is not callable というエラーに遭遇した場合、GraphClient コンストラクタがコールバック引数を期待しているため、辞書を直接渡すのではなく、トークンを返す関数を渡す必要があります。

    def acquire_token():
        # トークン取得のコード
        return msal_app.acquire_token_on_behalf_of(user_assertion=id_token, scopes=["https://graph.microsoft.com/.default"])
    
    graph_client = GraphClient(acquire_token)
    

    まとめ

    この記事では、MSALを使用してOneDriveにユーザー代理でアクセスする方法と、遭遇した問題の解決策を紹介しました。Microsoft Graph APIは強力であり、これを使用することでMicrosoft 365のさまざまなサービスと連携できます。

  • AWS S3バケットを安全に空にする方法:実践ガイド

    AWS S3バケットを安全に空にする方法:実践ガイド

    記事の導入

    はじめに、AWS S3バケットの内容を削除する必要がある一般的なシナリオを紹介します。例えば、プロジェクトの終了、リソースの再配置、テストデータのクリーンアップなどです。読者がこの記事を読むべき理由を説明し、AWS CLIの基本的な使用方法について簡単に触れます。

    必要なツールと前提条件

    AWS CLIのインストールと設定方法を説明し、AWSアカウントの適切な権限設定についても触れます。これには、S3バケットへのアクセス権限が含まれます。

    スクリプトの解説

    次に、汎用的なスクリプトを紹介します。まずは、スクリプト全体を示し、その後で重要な部分を分解して説明します。

    スクリプト

    #!/bin/bash
    
    # バケット名を引数から取得
    BUCKET_NAME="$1"
    
    if [ -z "$BUCKET_NAME" ]; then
      echo "バケット名が指定されていません。"
      exit 1
    fi
    
    # バケットの中身をリストアップ
    aws s3api list-objects --bucket "$BUCKET_NAME" --query 'Contents[].Key' --output text | while read -r line; do
      aws s3api delete-object --bucket "$BUCKET_NAME" --key "$line"
    done
    
    echo "$BUCKET_NAME の中身を全て削除しました。"
    
    

    スクリプトのポイント

    • バケット名の動的指定:バケット名をスクリプトの引数から取得し、汎用性を高めています。
    • 安全性の向上:バケット名が指定されていない場合にはエラーメッセージを表示し、スクリプトを終了させます。
    • 効率的な処理aws s3api list-objects コマンドを使用してオブジェクトのキーを取得し、それぞれに対して削除コマンドを実行します。

    終わりに

    スクリプトの使用方法と実際の使用例を紹介し、注意点やバケット削除のセキュリティ面での考慮事項を解説します。また、AWSの他のサービスとの連携や、このスクリプトを自動化ツールに組み込む方法についても触れると良いでしょう。

  • GitHubでフォークしたリポジトリをオリジナルと同期する

    GitHubでフォークしたリポジトリをオリジナルと同期する

    GitHubで他のプロジェクトをフォークすることは、そのプロジェクトに貢献したり、自分のプロジェクトでそのコードを利用したりする際の一般的なアプローチです。しかし、時間が経過すると、フォークしたリポジトリはオリジナルのリポジトリから遅れをとってしまうことがあります。この記事では、フォークしたリポジトリをオリジナルのリポジトリと同期する方法を詳しく解説します。

    ステップ1: オリジナルリポジトリを追加

    最初に行うべきことは、オリジナルリポジトリをあなたのローカルリポジトリのリモートとして追加することです。これにより、オリジナルリポジトリの変更をフェッチできるようになります。

    git remote add upstream git@github.com:aws-samples/aws-cdk-examples.git

    ステップ2: オリジナルリポジトリの変更をフェッチ

    次に、upstreamリモートから最新の変更をフェッチします。これは、オリジナルリポジトリの最新のコミットをローカルに取得する操作です。

    git fetch upstream

    ステップ3: ローカルのブランチにチェックアウト

    オリジナルリポジトリの変更をマージする前に、同期したいローカルのブランチにチェックアウトします。

    git checkout master

    ステップ4: オリジナルの変更をマージ

    upstreamからフェッチした変更をローカルのブランチ(この例ではmaster)にマージします。

    git merge upstream/master

    ステップ5: 変更をGitHubリポジトリにプッシュ

    最後に、ローカルの変更をGitHubリポジトリにプッシュします。これにより、オリジナルリポジトリの最新の変更があなたのフォークにも反映されます。

    git push origin master

    これらの手順を実行することで、フォークしたリポジトリはオリジナルリポジトリの最新の状態と同期されます。これにより、常に最新のコードで作業を続けることができます。

    このプロセスは、GitHub上でのオープンソースプロジェクトへの貢献や、最新の変更を自分のプロジェクトに取り込みたい場合に非常に役立ちます。是非、この手順を自分のワークフローに取り入れてみてください。

  • Handling Deprecated Types in AWS CDK: A Case Study on PRIVATE_WITH_NAT

    Handling Deprecated Types in AWS CDK: A Case Study on PRIVATE_WITH_NAT

    Introduction

    In the fast-evolving landscape of cloud infrastructure, keeping our Infrastructure as Code (IaC) up to date is crucial for maintaining efficiency, security, and cost-effectiveness. Recently, I encountered a scenario where a type I commonly used in AWS Cloud Development Kit (CDK) was marked as deprecated, leading to confusion due to the lack of updated documentation. This blog post aims to share my journey of identifying the issue, understanding the implications, and finding a workaround.

    The Challenge: Unexpected Deprecation

    While defining a Virtual Private Cloud (VPC) using AWS CDK in TypeScript, I noticed that the SubnetType.PRIVATE_WITH_NAT was unexpectedly marked as “deprecated.” Here’s a snippet of the code that led to the discovery:

    import { Vpc, SubnetType } from '@aws-cdk/aws-ec2';
    
    const vpc = new Vpc(this, "Vpc", {
      subnetConfiguration: [
        { name: "Public", subnetType: SubnetType.PUBLIC },
        { name: "Private", subnetType: SubnetType.PRIVATE_WITH_NAT },
        { name: "Isolated", subnetType: SubnetType.PRIVATE_ISOLATED }
      ]
    });
    
    

    Despite this, the official documentation had no mention of the deprecation, leaving me in a state of confusion about the correct approach to defining private subnets with NAT.

    Investigating the Issue

    To understand why PRIVATE_WITH_NAT was marked as deprecated and to find a solution, I embarked on a deep dive into the CDK source code, issue trackers, and the AWS documentation for updates. My setup involved using CDK CLI version 2.60 on MacOS 12.5, with Node.js version 14.17 and TypeScript version 4.9.4.

    Solution: Adapting to the Changes

    After thorough research, I learned that AWS CDK evolves rapidly, and certain types or methods can become deprecated as part of this evolution. The deprecation of PRIVATE_WITH_NAT was a move towards a more granular and flexible way of defining subnet configurations, allowing for better control over the networking architecture in AWS.

    Updated Approach

    To adapt to the change, I revised my VPC definition to use the updated subnet types and configurations, ensuring that my infrastructure code remained functional and aligned with the best practices. Here’s an updated snippet reflecting the changes:

    import { Vpc, SubnetType } from '@aws-cdk/aws-ec2';
    
    const vpc = new Vpc(this, "Vpc", {
      subnetConfiguration: [
        { name: "Public", subnetType: SubnetType.PUBLIC },
        // Adjusted to use the new method or type for private subnets with NAT
        { name: "Private", subnetType: SubnetType.PRIVATE },
        { name: "Isolated", subnetType: SubnetType.PRIVATE_ISOLATED }
      ]
    });
    
    

    Note: This snippet assumes a generic update and might need adjustment based on the specific alternatives provided by AWS CDK at the time of your implementation.

    Conclusion

    Dealing with deprecations in IaC can be challenging, especially when documentation does not immediately reflect these changes. However, it also presents an opportunity to dive deeper into the tools we use, understanding their internals and staying ahead of the curve. Through this experience, I’ve learned the importance of regularly reviewing the release notes of the tools and libraries in our stack, participating in community forums, and testing our infrastructure regularly to catch such issues early.

    I hope this case study helps other developers navigate similar challenges and encourages an active engagement with the evolving cloud ecosystem.

  • AWSアカウント作成とMFA設定: 安全なクラウド環境構築のステップバイステップガイド

    AWSアカウント作成とMFA設定: 安全なクラウド環境構築のステップバイステップガイド

    はじめに

    AWSアカウントの作成からMFA(多要素認証)の設定まで、初心者でも簡単にフォローできる手順をご紹介します。正しいセットアップを行うことで、AWS環境を安全に保ちながら、EC2、S3などのサービスをフル活用することができます。

    MFAの設定とアカウントの利用開始

    セキュリティを強化するため、MFAの設定は必須です。MFAを設定することで、パスワードだけでなく、物理的なデバイスからのコードが必要になり、アカウントの安全性が向上します。

    1. MFAの追加
      • IAMダッシュボードから「セキュリティ認証情報」を選択し、「MFAデバイスの追加」をクリック。
      • MFAデバイスタイプを選択し(例:仮想MFA)、デバイスのQRコードをスキャンします。
      • アプリケーション(例:Google Authenticator)で生成されたコードを入力して、MFAを有効化します。
    2. MFAポリシーの適用
      • 以下のポリシーをアタッチさせます。

    MFAポリシーについての説明

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "AllowViewAccountInfo",
                "Effect": "Allow",
                "Action": [
                    "iam:GetAccountPasswordPolicy",
                    "iam:ListVirtualMFADevices"
                ],
                "Resource": "*"
            },
            {
                "Sid": "AllowIndividualUserToSeeAndManageOnlyTheirOwnAccountInformation",
                "Effect": "Allow",
                "Action": [
                    "iam:ChangePassword",
                    "iam:CreateLoginProfile",
                    "iam:DeleteLoginProfile",
                    "iam:GetLoginProfile",
                    "iam:ListAccessKeys",
                    "iam:UpdateLoginProfile",
                    "iam:ListSigningCertificates",
                    "iam:ListSSHPublicKeys",
                    "iam:GetSSHPublicKey",
                    "iam:GetUser"
                ],
                "Resource": "arn:aws:iam::*:user/${aws:username}"
            },
            {
                "Sid": "AllowManageOwnVirtualMFADevice",
                "Effect": "Allow",
                "Action": [
                    "iam:CreateVirtualMFADevice",
                    "iam:DeleteVirtualMFADevice"
                ],
                "Resource": "arn:aws:iam::*:mfa/${aws:username}"
            },
            {
                "Sid": "AllowManageOwnUserMFA",
                "Effect": "Allow",
                "Action": [
                    "iam:DeactivateMFADevice",
                    "iam:EnableMFADevice",
                    "iam:ListMFADevices",
                    "iam:ResyncMFADevice"
                ],
                "Resource": "arn:aws:iam::*:user/${aws:username}"
            },
            {
                "Sid": "DenyAllExceptListedIfNoMFA",
                "Effect": "Deny",
                "NotAction": [
                    "iam:CreateVirtualMFADevice",
                    "iam:ChangePassword",
                    "iam:EnableMFADevice",
                    "iam:GetUser",
                    "iam:ListMFADevices",
                    "iam:ListVirtualMFADevices",
                    "iam:ResyncMFADevice",
                    "sts:GetSessionToken"
                ],
                "Resource": "*",
                "Condition": {
                    "BoolIfExists": {
                        "aws:MultiFactorAuthPresent": "false",
                        "aws:ViaAWSService": "false"
                    }
                }
            }
        ]
    }
    

    上記ポリシーは、IAMユーザーが自分のアカウント情報を表示・管理し、MFAデバイスを管理できるようにする一方で、MFAが有効でない場合には指定されたアクションを除いてすべてのアクションを拒否するように設計されています。このポリシーはセキュリティを強化し、MFAが有効でないときにアカウントに対する潜在的な不正アクセスを防ぐためのものです。

    • AllowViewAccountInfo & AllowIndividualUserToSeeAndManageOnlyTheirOwnAccountInformation: ユーザーが自分のアカウント情報やパスワードポリシーを取得し、ログインプロファイルを管理できるようにします。
    • AllowManageOwnVirtualMFADevice & AllowManageOwnUserMFA: ユーザーが自分のMFAデバイスを作成、削除、同期させることを許可します。
    • DenyAllExceptListedIfNoMFA: MFAが有効でない場合に、リストされている特定のアクションを除いてすべてのアクションを拒否します。これにより、MFAが有効になっていない限り、ユーザーが操作を行うことが防止されます。

    その後ログアウトし、再度ログインします。この時MFAコードの入力が求められます。

    MFA認証をパスすると、AWSの各サービスにアクセスできるようになります。(もちろん必要な権限のポリシーやロールはAttachされている必要があります。)

    アクセスキーの設定とAWS CLIの使用

    AWS CLIを使用するには、適切なアクセスキーの設定が必要です。IAMでアクセスキーを作成し、CLIでの認証に使用します。

    アクセスキーの作成

    • IAMダッシュボードで「ユーザー」を選択し、作成したIAMユーザーに対して「セキュリティ認証情報」タブを開き、「アクセスキーの作成」を選択します。
    • 新しいアクセスキーが生成されるので、表示された情報を安全な場所に保存します。

    AWS CLIの設定:

    • AWS CLIがまだインストールされていない場合は、AWS公式サイトからインストールを行います。
    • ターミナルまたはコマンドプロンプトを開き、aws configureコマンドを実行します。
    • プロンプトに従って、先ほど生成したアクセスキーIDとシークレットアクセスキーを入力します。リージョン名(例:ap-northeast-1)と出力形式(例:json)も設定します。

    GitHub上のaws-mfaツールは、AWSの多要素認証(MFA)を容易に管理するためのコマンドラインツールです。このツールを使用することで、AWS CLIを使用する際に一時的なセキュリティ認証情報を簡単に取得し、MFA保護されたリソースへのアクセスを安全に行うことができます。

    aws-mfaツールの設定と使用方法:

    1. ツールのインストール: aws-mfaはPythonで書かれているため、Pythonがシステムにインストールされている必要があります。GitHubのリポジトリページに従って、aws-mfaをインストールします。
    2. AWS Credentialsの設定: ~/.aws/credentialsファイルに長期的なAWSアクセスキーを設定します。これは、aws-mfaが一時的な認証情報を生成する際の基礎となります。
    3. MFAデバイスのARN設定: MFAデバイスのAmazon Resource Name (ARN)を特定し、この情報をaws-mfaの設定に含めます。
    4. 一時的なセキュリティ認証情報の取得: コマンドラインからaws-mfaを実行し、MFAトークンコードを入力することで、一時的な認証情報を取得します。これにより、MFA保護されたAWSリソースへのアクセスが可能になります。

    MFAを利用したAWS CLIのセキュアな使用

    AWS CLIを使用する際にMFA認証を要求する設定は、セキュリティをさらに強化します。

    1. 一時セキュリティ認証情報の取得
      • MFAデバイスが設定されているIAMユーザーでAWS CLIコマンドを実行するには、一時セキュリティ認証情報が必要です。
      • 以下のコマンドを使用して、一時セキュリティ認証情報を取得します。

        aws sts get-session-token --serial-number arn:aws:iam::<your-account-id>:mfa/<your-mfa-device-name> --token-code <mfa-code> --duration-seconds 3600
      • このコマンドは、MFAデバイスから取得したトークンコードとともに、セッショントークン、アクセスキーID、シークレットアクセスキーを返します。
    2. 一時認証情報の使用
      • 取得した一時認証情報を利用して、AWS CLIコマンドをセキュアに実行します。
      • 一時認証情報は、指定された期間(この例では3600秒)のみ有効です。

    結論

    AWSアカウントの作成からMFAの設定、さらにはアクセスキーの生成とAWS CLIの使用まで、このガイドを通じて、AWS環境を安全に利用するための基礎を学びました。セキュリティはクラウド環境での作業において非常に重要です。適切な設定を行うことで、リソースの安全性を保ちつつ、AWSのパワフルなサービスを最大限に活用することができます。始めるのが初めてであれば、この記事をステップバイステップでフォローし、セキュアなクラウド環境の構築に挑戦してください。

  • 発明家の挑戦

    この記事を読んで学べること:

    • 「I was wondering when you’d show up! No one wants to try my Telepod.」というフレーズを通じて、英語の日常会話でよく使われる表現を学びます。
    • 相手の行動や反応に対する期待と失望を伝える表現を理解します。

    今回の表現: “Lucca: I was wondering when you’d show up! No one wants to try my Telepod.”

    日本語訳: 「ルッカ: いつ来るのかと思ってたよ!誰も私のテレポッドを試したがらないの。」

    文法解析: この文では “I was wondering” という過去進行形を使い、過去のある時点での考えや疑問を表しています。”when you’d show up” は間接疑問文で、”you would show up” の短縮形です。”No one wants to try” は否定文で、主語が “No one” の場合、動詞は三人称単数の形になります。

    他の表現との違い:

    オリジナルの表現似た表現使い方の違い
    例文
    was wonderingwas thinking“wondering” は疑問や好奇心が含まれているが、
    “thinking” は単なる考えや計画を指す。
    “I was thinking about going to the beach tomorrow.”
    (明日、ビーチに行こうと思ってたんだ。)
    show upturn up“show up” は計画された出現や参加を指し、
    “turn up” は予期せぬ現れを示すことが多い。
    “He didn’t turn up to the meeting yesterday.”
    (彼は昨日の会議に現れなかった。)

    英語学習者として覚えておくべきポイント: 「I was wondering」や「show up」は、英語の会話でよく使われる便利なフレーズです。特に「I was wondering」は、丁寧な疑問の表現として用いられることが多く、ビジネスシーンでも活用できます。「No one wants to try」は、あるアクションや提案に対する興味や意欲の欠如を示すのに使えますが、文脈に応じて慎重に使う必要があります。ビジネス的なコミュニケーションでは、相手の感情や立場を尊重しつつ、正直かつ効果的なフィードバックを提供することが重要です。

  • 気づかぬ心 – 「You’re an oblivious one, aren’t you? Well, never mind then.」の表現を学ぶ

    気づかぬ心 – 「You’re an oblivious one, aren’t you? Well, never mind then.」の表現を学ぶ

    この記事を読んで学べること:

    • 「oblivious」という言葉の意味と会話での使用法
    • 相手が注意を払っていない時の優しい指摘の仕方
    • 英語での間接的な表現を用いたフィードバックの技術

    今回の表現: “You’re an oblivious one, aren’t you? Well, never mind then.”

    日本語訳: 「あなたは気づかないタイプですね。まあ、いいですけど。」

    文法解析: このフレーズは、「oblivious」を用いて相手が何かに気づいていないことを指摘し、「aren’t you?」でその事実を相手に問いかけます。続く「Well, never mind then.」は、その状況を受け入れ、話を進める意思を示しています。

    他の表現との違い:

    オリジナルの表現似た表現使い方の違い例文
    You’re an oblivious oneYou seem distracted「You’re an oblivious one」は相手が一般的に気づかない性質があることを示し、「You seem distracted」はその瞬間に集中していない様子を指摘します。You seem distracted today, is everything alright?

    覚えておくべきポイント: 「You’re an oblivious one, aren’t you?」という表現は、相手が何かを見落としていることを指摘する際に使われることがありますが、この言い方は非常にカジュアルで、親しい間柄でなければ不快に感じられる可能性があります。会話においては、このような表現を使う前に、相手との関係性や文脈を考慮することが重要です。

  • AWS LambdaでGo1.xランタイムからAmazon Linux 2へスムーズに移行する方法

    AWS LambdaでGo1.xランタイムからAmazon Linux 2へスムーズに移行する方法

    はじめに

    AWS Lambdaは、サーバーレスコンピューティングを可能にするAWSの重要なサービスですが、Lambda はGo1.xランタイムの廃止とprovided.al2ランタイムへの移行を予定しています​​。

    この記事では実際に変更した際に修正した箇所についてまとめます。

    変更内容

    公式ブログと、クラメソさんの記事を参考に以下の通り変更しました

    Resources:
      HelloWorldFunction:
        Type: AWS::Serverless::Function
        Metadata:
          BuildMethod: go1.x 
        Properties:
          CodeUri: hello-world/ # folder where your main program resides
          Handler: bootstrap
          Runtime: provided.al2
          Architectures:
            - x86_64

    sam deploy 後

    以下のようなエラーが発生しました

    Phase: invoke Status: error Error Type: Runtime.Unknown

    問題への対処

    調べたところ、 github.com/aws/aws-lambda-goが古いとal2 runtimeに対応してないことがわかりました。 そのため、以下の対処を行いました。

    go get github.com/aws/aws-lambda-go
    go mod download gopkg.in/yaml.v3 
    

    古い aws-lambda-go は provided.ai2 ランタイムには対応してないようで細心にする必要があったようです。

  • Poetryと依存関係の問題: 問題点、原因、対処方法

    Poetryと依存関係の問題: 問題点、原因、対処方法

    問題点

    Pythonのプロジェクトでよく使用される依存関係管理ツール、Poetryを使用している際に、ビルドプロセスが失敗し、次のエラーメッセージが表示されました。

    Warning: poetry.lock is not consistent with pyproject.toml. You may be getting improper dependencies. Run `poetry lock [--no-update]` to fix it. Because hogehoge depends on psycopg2-binary (2.9.9) which doesn't match any versions, version solving failed.

    このメッセージは、依存関係の不整合と特定のパッケージバージョンが見つからないという二つの問題を示しています。

    原因

    1. poetry.lockpyproject.toml の不整合

    poetry.lock ファイルは、プロジェクトの依存関係を安定的に保つために使用されます。このファイルが pyproject.toml と整合していない場合、依存関係に関する不整合が発生し、ビルドプロセスに影響を与える可能性があります。

    2. psycopg2-binary のバージョン問題

    psycopg2-binary の指定されたバージョン 2.9.9 が利用可能なバージョンと一致しないため、依存関係の解決に失敗しています。

    対処方法

    1. poetry.lockpyproject.toml の不整合の修正

    • poetry lock --no-update コマンドを実行して、poetry.lock ファイルを pyproject.toml と整合させます。

    2. psycopg2-binary のバージョン問題の解決

    • pyproject.toml ファイルを確認し、psycopg2-binary のバージョン指定を利用可能なものに更新します。例えば、より柔軟なバージョン指定(^2.9 など)を使用することができます。

    3. 依存関係の再インストール

    • 上記の変更後、poetry install を実行して依存関係を再インストールし、問題が解決されたかを確認します。

    4. テストと確認

    • ローカル環境で変更をテストし、ビルドプロセスが正常に完了することを確認します。

    この記事を通じて、Poetryを使用した依存関係管理の問題とその解決方法についての理解を深めることができます。また、Pythonプロジェクトでのビルドプロセスをよりスムーズに行うための実用的な知識も得られるはずです。