34

を通じて複数のアマゾン ウェブ サービス (AWS) アカウントを管理する最良の方法は何botoですか?

私は使用しているBotoConfigファイルに精通しています。しかし、各ファイルには 1 つのアカウントしか記述されていません...そして、私は 1 つの組織だけではありません。通常の法的、財政的、およびセキュリティ上の理由から、これらのアカウントを混合することはできません。

現在boto、アカウントごとに 1 つの構成ファイルを使用しています。例えば:

  • ~/.botoデフォルトのアカウント
  • ~/.boto_clowncollege「クラウンカレッジ」アカウント用
  • ~/.boto_razorassoc「razorassoc」アカウント用
  • ~/.boto_xyz「xyz」アカウントの場合

次に、次のようなもの:

def boto_config_path(account=None):
    """
    Given an account name, return the path to the corresponding boto
    configuration file. If no account given, return the default config file.
    """
    path = '~/.boto' + ('_' + account if account else '')
    clean_path = os.path.abspath(os.path.expanduser(path))
    if os.path.isfile(clean_path):
        return clean_path
    else:
        errmsg = "cannot find boto config file {} for {}".format(clean_path, account)
        raise ValueError(errmsg)

def aws_credentials(account=None):
    """
    Return a tuple of AWS credentials (access key id and secret access key) for
    the given account.
    """
    try:
        cfg = INIConfig(open(boto_config_path(account)))
        return ( cfg.Credentials.aws_access_key_id, cfg.Credentials.aws_secret_access_key )
    except Exception:
        raise

conn = EC2Connection(*aws_credentials('razorassoc'))

良い、悪い、または無関心ですか?提案された改善?

4

5 に答える 5

73

2015 年 2月 6 日更新、2015 年 3 月 19 日をトップ セクションに従って修正

boto および AWSCLI 資格情報の新しい標準化された共有 (boto>==2.29.0)

boto 2.29 以降、BOTO および AWS CLI 資格情報を共有するための新しい簡単な方法があります。Mike Garnaatが AWS SDK で資格情報を管理するための新しい標準化された方法で説明しています。

目的は次のとおりです。

  1. boto、AWSCLI、およびその他の SDK による認証情報の共有を許可する
  2. ユーザープロファイルディレクトリにある単一のファイルにすべての構成を保持します
  3. 名前付きプロファイルの使用を許可する
  4. できるだけシンプルに保つ (例: 他のメソッドとの競合を避ける)

認証情報ファイルを作成する

ファイル~/.aws/credentials(Mac/Linux) または%USERPROFILE%\.aws\credentials(Windwos) を次のように作成します。

[default]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr
region = eu-west-1

[jekyl]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr
region = eu-west-1

[hyde]
aws_access_key_id = AxxxZ
aws_secret_access_key = CxxxZ
region = eu-west-1

これからは、次のようなコードを使用できます。

デフォルトのプロファイルを使用

import boto
con = boto.connect_s3()

AWS_PROFILEenvによって設定された明示的なプロファイルを使用します。変数

(これは私のお気に入りのオプションで、プロファイル名をコードから除外し、アプリケーションのデプロイ担当者に特定のプロファイルを選択する機会を与えます)

$ export AWS_PROFILE=jekyl

コードを以前と同じようにシンプルに保ちます。

import boto
con = boto.connect_s3()

コードで明示的なプロファイルを指定する

import boto
con = boto.connect_s3(profile_name="jekyl")

これは、通常行う必要があるすべてです

適切な資格情報を選択するためのロジックは、boto issue #2292で次のように説明されています。

優先度の高いものから低いものへの読み込み順序:

1.コードから直接渡す

  1. キー/シークレットの環境変数

  2. プロファイルの環境変数

  3. 共有資格情報ファイルの明示的プロファイル

  4. 共有認証情報ファイルのデフォルト プロファイル

  5. 構成ファイルの明示的なプロファイル

  6. 構成ファイルの資格情報セクション

コードから渡されたプロファイルは、環境変数の設定をオーバーライドします。

物事をクリーンでシンプルに保つために、古いスタイルのファイル (~/.aws/configまたは など~/.boto) を削除し、環境変数BOTO_CONFIGが設定されている場合は設定を解除し、場合によってはそのような変数が指すファイルも削除することをお勧めします。

boto >=2.29.0 の場合はこれですべてです。

注: env.variable (のようにAWS_CONFIG_FILE) によって構成ファイルの場所を制御しようとしないでください。期待どおりに動作しません。

boto 構成プロファイルを使用 (boto>=2.24.0)

以下の説明は、boto 2.29.0 以降にアップグレードできない方のためにのみここに残されています。

boto 2.24.0以降、と呼ばれる機能がありますprofile_name

ファイルに~/.botoは既に [Credentials] セクションがあり、これはフォールバック オプションとして機能し、[profile ] セクションはさまざまなプロファイルに使用されます。

[Credentials]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr

[profile jekyl]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr

[profile hyde]
aws_access_key_id = AxxxZ
aws_secret_access_key = CxxxZ

次に、接続を作成するときに、次の方法を使用します。

import boto
con = boto.connect_s3(profile_name="jekyl")

この機能は boto 2.24.0 以降で利用できることに注意してください。

チュートリアルはこちらhttp://docs.pythonboto.org/en/latest/boto_config_tut.html?highlight=profile

キーリングの使用に関する注意事項もありますが、数年前から夢見ていたこのプロファイルの機能にまず慣れます。

構成ファイルを AWSCLI と共有する

AWSCLI は本当に素晴らしいツールになりました。設定ファイルのフォーマットはほぼ同じなので、以下のように使います。

  1. ファイルをAWSCLI~/.aws/configによって作成されたままにします (これがデフォルトの場所です)
  2. セクションをコピー[default]して名前を変更し[Credentials]ます (同じ値を内部に残します)。
  3. 使用するプロファイルを追加します
  4. このファイルBOTO_CONFIGを指すように変数を設定します。~/.aws/config

これ~/.botoは、次の内容の `~/.aws/config になります。

[default]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr

[Credentials]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr

[profile jekyl]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr

[profile hyde]
aws_access_key_id = AxxxZ
aws_secret_access_key = CxxxZ

このようにして、プロファイルを含む AWSCLI と boto の両方で共有されます。

于 2014-01-25T01:48:47.977 に答える
11

将来、boto は複数の認証情報を管理するのに役立つより優れたツールを提供する予定ですが、現時点では、いくつかの環境変数が役立つ可能性があります。

まず、使用する boto 構成ファイルを指すように BOTO_CONFIG を設定できます。これにより、通常の場所にある構成ファイルが上書きされます。

次に、BOTO_PATH をコロンで区切られた場所のリストに設定して、boto 構成ファイルを検索すると、通常の検索場所の前にまずそこが検索されます。

どちらもあなたが望むものを正確に与えるものではありませんが、少し少ないコードで簡単に達成できるかもしれません.

これを boto でどのように機能させたいかについてのアイデアがある場合は、お知らせください。

于 2012-07-02T13:02:35.563 に答える
6

個別の boto 構成ファイルを多数作成するのではなく、ConfigParser モジュールを使用して、アカウントごとに .boto ファイルにセクションを作成することを検討してください。

あなたの .boto ファイルは次のようになります

#Contents of ~/.boto
[clown-college]
aws_access_key_id = 123sesamestreet
aws_secret_access_key = 678idsaf567ujd
[razor-assoc]
aws_access_key_id = 437piedmont
aws_secret_access_key = 997567ujdfs

Python コードで、ConfigParser を使用して、使用するアカウントの適切なアクセス キーを読み込みます。

import ConfigParser
from os.path import expanduser

########## BEGIN MAIN ##############

# get the path to the user's homedir
user_home = expanduser("~")

#load their .boto config file
config = ConfigParser.ConfigParser()
config.read([str(user_home + "/.boto")])

#get the keypair for ClownCollege
print config.get('clown-college', 'aws_access_key_id')
print config.get('clown-college', 'aws_secret_access_key')

print config.get('razor-assoc', 'aws_access_key_id')
print config.get('razor-assoc', 'aws_secret_access_key')

これを関数にラップして、boto コード全体で使用し、正しいアカウントを簡単に設定できます。

于 2013-10-24T00:22:02.240 に答える