ã¯ããã«
èŠã€ãããããã€ã³ã¹ããŒã«ãããããœãããŠã§ã¢ããã±ãŒãžã¯ãéçºè
ã«ãšã£ãŠäœ¿ããããã§ããReactãRuby on RailsãAirflow ã®ãããªæå㪠OSS ã¯è¯ãäºäŸã§ãããããã瀟å
ã®éå
¬éã®ã³ãŒãã¯ãäŒæ¥ç§å¯ãšããŠäžéããé ãããããšãå€ãã§ããæš©éãæã£ãŠãã人ã®ã¿èŠãããšãã§ããŠããªãŒãã³ãœãŒã¹ã®ããã« npm gem ã pip ã§ç°¡åã«ã€ã³ã¹ããŒã«ããããšãã§ããŸããã
ãã®çµæã瀟å ã®ã³ãŒããããŸãåå©çšãããªããªãïŒãããã¯ã§ããªããªãïŒããšããããŸããåããŒã ã¯ããããç¬ç«ããã³ãŒãããŒã¹ãæã¡ãä»ã®ããŒã ã«ã³ãŒããå ±æããããŠããæºè¶³ããã解決çãå°ãåºãããšãé£ããã£ããããŸããæŠç¥ãç«ãŠãªããŸãŸã§ã¯ãããããã®ç¬ç«ããã³ãŒãããŒã¹ãå å®ããç¶ãã瀟å å ±éã®ã©ã€ãã©ãªãŒããé ã倢ã®ããã«ãªã£ãŠãããŸãã
ããªãã®äŒç€Ÿã§ãå¿åœãããããã®ã§ã¯ãªãã§ããããïŒã§ã¯ã瀟å ã³ãŒããäžçã«å ¬éããã«ãå éšã§å ±æããããã«ã¯ã©ããããããã®ã§ããããïŒ
ãã®èšäºã§ã¯ã2ã€ã®ããæ¹ãããããããããšæããŸãã
- å ±éã®ã³ãã³ãã©ã€ã³ããŒã«ãã³ã³ããåãããã©ã€ããŒãã¬ãžã¹ããªã«èŒããã
- å ±éã®ã©ã€ãã©ãªãŒ(ããã±ãŒãž)ããã©ã€ããŒããªããžããªã«èŒããã
瀟å ã³ãŒããå ¬éããã«å éšã§å ±æããæ¹æ³
1. ã³ãã³ãã©ã€ã³ããŒã«ãã³ã³ããåãã
ãããç¹å®ã®ã¡ã³ããŒïŒäŸ: 瀟å ã®éçºè ïŒã«å ±æãããã³ãã³ãã©ã€ã³ããŒã«ããã£ããããã®ããŒã«ãã³ã³ããåãããã©ã€ããŒãã³ã³ããã¬ãžã¹ããªã«èŒããããšãããããããŸãã
ãªãã³ã³ããåããã®ãïŒ
PythonãBashãRubyãªã©ã§äœã£ã "ã¡ãã£ãšããã¹ã¯ãªãã" ã¯ããã®å Žéãã§å¿ èŠãšãããå Žåã«ã¯ãå¹çãããçŽ æŽããããã®ã§ãããããããããã£ãã¢ãããã¯ãªã¹ã¯ãªãããäœåã䜿ãç¶ããŠããã®ã§ããã°ã瀟å ã®ä»ã®äººïŒå°æ¥å ¥ç€Ÿãã人ãéè·ããåŸã«æ¥åãåŒãç¶ã人ãå«ãïŒã«ããã®ããŒãºãããã§ããããã ã£ãããã¿ããªã®ä»äºãå°ãã§ã楜ã«ã§ããããã«ããã®ã¹ã¯ãªãããå¯èœãªéãåå©çšããæ¹ãããã®ã§ã¯ãªãã§ããããïŒ
äŸãã°ãName ã¿ã°ãæå®ã㊠AWS EC2 ã€ã³ã¹ã¿ã³ã¹ãèµ·åãããããªãçããŠç°¡åãªã¹ã¯ãªãããäœã£ããšããŸãã
./start_ec2_instances dev-1 dev-2
ãããããã®ãŸãŸã§ã¯ã以äžã®ãããªæ¬ ç¹ããããŸãã
- æžããæ¬äººãã䜿ããªã
- Aããã®æ°ããMacBook Proã§åããªã
- SREããŒã ã®Aãããåãããšãããã¹ã¯ãªããã3ã¶æåã«æžããã®ã§ã2æéãç¡é§ã«ããŠããŸã£ã
代ããã«ã瀟å ã«ã³ã³ããåãããã¹ã¯ãªããã®äžèЧãçšæããŸããããããããããšã§ã瀟å ã®èª°ãããéçºèšèªãåããè²¢ç®ã§ããŠãä»ã®éçºè ãäœã£ãã¹ã¯ãªããã䜿ããŸãã
| ã€ã¡ãŒãžURI (READMEãžã®ãªã³ã¯) | çšé | åãåããå |
|---|---|---|
| ghcr.io/<company>/start_ec2_instances | EC2 ã€ã³ã¹ã¿ã³ã¹ã Name ã¿ã°ã§èµ·åãã |
Aãã (SRE) |
| registry.hub.docker.com/<company>/zips3file | S3ãžã®ãã¡ã€ã«ã®ããŠã³ããŒããzipå§çž®ãåã¢ããããŒã | Bãã (Data Science) |
| ... |
å®è¡æ¹æ³ã¯ããªãŒãã³ãœãŒã¹ã®ã³ã³ãããšåãã§ãã
docker run --rm -v "$HOME/.aws:/root/.aws" ghcr.io/<company>/start_ec2_instances dev-1 dev-2
ããã§ãèš±å¯ããããã°èª°ã§ãå®è¡ã§ããŠãLinuxãMac M1/Intelããã€Windowsã§ãæåãåãã§ãã![]()
buildkitã®ãããªããŒã«ã§ãã³ã³ããã€ã¡ãŒãžãè€æ°ã®CPUã¢ãŒããã¯ãã£ãŒåãã«ãã«ãã§ããŠãdocker run å®è¡æã«é©åãªæ¹ãéžãã§ãããŸãããŸãã§ãã©ã®ãã·ã³ã§ãåããã€ããªãŒãã®ããã§ãã
ã©ã®ã¬ãžã¹ããªã䜿ãã°ããã®ãïŒ
äŒç€ŸããœãŒã¹ã³ãŒãã®ç®¡çã«äžã€ã®GitHubãŸãã¯GitLabãªãŒã¬ããŒãŒã·ã§ã³ã䜿ãå Žåã¯ãGitHub Container Registry ã GitLab Container Registry ãããããããŸããè¿œå æéã¯ããããŸããããã³ãŒããšåããã©ãããã©ãŒã ã§ç®¡çã§ããŸãã
ããŒã ããšã«ãªãŒã¬ããŒãŒã·ã§ã³ãåãããŠããããã°ã«ãŒãå ã®ä»ã®äŒç€Ÿãšååããå¿ èŠãããå Žåã¯ãããæ¹ãå°ã工倫ããå¿ èŠããããŸãã
å¯èœã§ããã°ãDocker Hub ã®ãããªãµãŒãã¹ã§ãå ±éã³ã³ããã¬ãžã¹ããªããäœæããŠãå šå¡ãæåŸ ããŸããããããã§ãç¡çãªããAmazon ECR ã®ãããªã¯ã©ãŠããããã€ããŒã¬ãžã¹ããªãããããããŸããIAMããªã·ãŒã§ä»ã®ã¢ã«ãŠã³ãã®ãŠãŒã¶ãŒã«ã³ã³ããã€ã¡ãŒãžã®ã¢ã¯ã»ã¹æš©ãä»äžããããšãã§ããŠãã¿ã°ãã³ã³ããã¹ãããŒã§èª°ã«ã©ã®ã³ã³ããã€ã¡ãŒãžãå ±æãããå¶éããããšãã§ããŸãã
äŸãã°ã以äžã®IAMããªã·ãŒãECRãªããžããªã«ä»ãããšããã®äžã®ãã¹ãŠã®ã³ã³ããã€ã¡ãŒãžã«å¯ŸããŠã以äžã®æ¡ä»¶ã§push/pullã¢ã¯ã»ã¹ãèš±å¯ããŸãã
- ãªããžããªã®
sharedã¿ã°ãtrueã§ãã - ã¢ã«ãŠã³ã
123456789012ã® IAM ãŠãŒã¶ãŒã®ã¿ã¢ã¯ã»ã¹ã§ãã -
job-category = developerã®ã¿ã°ãæã€ IAM ãŠãŒã¶ãŒã®ã¿ã¢ã¯ã»ã¹ã§ãã - äŒç€Ÿã® VPN (IP ã¢ãã¬ã¹
123.45.678.90) ã«æ¥ç¶ãããŠãããŠãŒã¶ãŒã®ã¿ã¢ã¯ã»ã¹ã§ãã
{
"Version": "2012-10-17",
"Id": "CrossAccountECRPolicy1",
"Statement": [
{
"Sid": "AllowPushPull",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::123456789012:user/*"
]
},
"Action": [
"ecr:BatchGetImage",
"ecr:BatchCheckLayerAvailability",
"ecr:CompleteLayerUpload",
"ecr:GetDownloadUrlForLayer",
"ecr:InitiateLayerUpload",
"ecr:PutImage",
"ecr:UploadLayerPart"
],
"Condition": {
"ecr:ResourceTag/shared": [
"true"
],
"StringEquals": {
"aws:PrincipalTag/job-category": "developer"
},
"IpAddress": {
"aws:SourceIp": "123.45.678.90"
}
}
}
]
}
ãã®IAMããªã·ãŒããã¹ãŠã®ECRãªããžããªã«è¿œå ããŠãå
±æããããªããžããªã ã shared ã¿ã°ã true ã«èšå®ããã°ãã³ã³ããã€ã¡ãŒãžã®URLãå
¬éããŠããâã®æ¡ä»¶ãæºããããŠãŒã¶ãŒã®ã¿ã¢ã¯ã»ã¹ã§ããŸãã
ã©ããã£ãŠã³ã³ããåããã®ãïŒ
空ã£ãœã®ãã£ã¬ã¯ããªãäœæãããã®äžã«ã¹ã¯ãªãããšDockerfileã眮ããŠãã ããã
start_ec2_instances
âââ Dockerfile
âââ README.md
âââ test123.py
âââ requirements.txt
è€æ°ã® Python ã¹ã¯ãªãããããå Žåãclick ã®ãããªã©ã€ãã©ãªãŒã§1ã€ã®CLIã«ãŸãšãããšãå®è¡ãããããªããŸããã·ã§ã«ã¹ã¯ãªããã§äœæ¥ããŠããå Žåãgetopts ã Makefile ã§1ã€ã® ENTRYPOINT ãçšæããããšãããããããŸãã
ãªã¢ãŒããªããžããªãšèªèšŒããŠãã€ã¡ãŒãžããã«ãããŠããã·ã¥ããŸããBUILDKITãªã©ã§è€æ°ã®CPUã¢ãŒããã¯ãã£ãŒã«å¯Ÿå¿ããã®ãããã§ãããã
export DOCKER_BUILDKIT=1
echo $GCR_PAT | docker login ghcr.io -u USERNAME --password-stdin
docker build -t ghcr.io/<github_account_name>/start_ec2_instance --platform linux/amd64,linux/arm64 .
docker push ghcr.io/<github_account_name>/start_ec2_instance
ããã§ãã³ã³ããã€ã¡ãŒãžããããªãã¯ãªããžããªã«ã¢ããããŒãã§ããŸãããå ±æãããã¡ã³ããŒã«äœ¿ãæ¹ãæããŠãããŠãã ããã
docker run --rm ghcr.io/<github_account_name>/start_ec2_instance dev-1 dev-2
2. å ±éã®ã©ã€ãã©ãªãŒããã©ã€ããŒããªããžããªã«
ãããç¹å®ã®ã¡ã³ããŒã«å
±æããããœãããŠã§ã¢ããã±ãŒãžãããå ŽåãAWS CodeArtifact, Google Cloud Artifact Registry ãŸã㯠GitHub Packages ã®ãããªã¯ã©ãŠããœãªã¥ãŒã·ã§ã³ã§ ãã©ã€ããŒããªããžã㪠ãäœãããšãããããããŸããããã±ãŒãžãèŒãããšãã¢ã¯ã»ã¹æš©ã®ãã人㯠gemãnpm ã pip ã®ãããªäžè¬çãªããã±ãŒãžãããŒãžã£ã§ã€ã³ã¹ããŒã«ã§ããŸãã
ã¢ãŒãã£ãã¡ã¯ãã¬ãžã¹ããª/ãªããžããªãšã¯ããã€ããªãã¡ã€ã«ãã³ãŒãããã±ãŒãžãä¿åããŠé åžããããã®ä»çµã¿ã§ããäŸãã°ãPyPI ã¯ãPythonã®OSSããã±ãŒãžçšã®ã¬ãžã¹ããªã§ããnpm ã¯ãJavaScriptããã±ãŒãžã®ã¬ãžã¹ããªã§ãã
ããããã¯ãAWS CodeArtifactã§ãã©ã€ããŒããªããžããªãäœæããPythonããã±ãŒãžãèŒããä»ã®ã¢ããªã±ãŒã·ã§ã³ããã€ã³ã¹ããŒã«ããæµãããèŠãããŸããä»ã®èšèªã§ã䌌ããããªæµãã«ãªãã¯ãã§ãã
AWS CodeArtifact ã«ãã©ã€ããŒãPythonããã±ãŒãžãèŒãã
1. CodeArtifactã®ã³ã³ãœãŒã«ãéãããã¡ã€ã³ãäœæããŸãã
ãã¡ã€ã³ã¯ãããã±ãŒãžãããŠã³ããŒãããæã«äœ¿ãããŒã¹URLã®ããšã§ãçµç¹/äŒç€Ÿããšã«1ã€ããã°ååã§ããéåžžã¯ããã®URLãæå®ããã«ããã±ãŒãžãã€ã³ã¹ããŒã«ããŸãããè£ã§ãããªãã¯ãªããžããªïŒäŸ: pypi.orgïŒã®URLã䜿ãããŠããŸãã

2. ããã±ãŒãžãä¿åããããã®ãªããžããªãäœæããŸããåã®ã¹ãããã§äœã£ããã¡ã€ã³ãšé¢é£ä»ããŸãã

3. æ°ãããã£ã¬ã¯ããªã§ãç°¡åãªPythonããã±ãŒãžãäœæããŸãããã®èšäºã§ã¯ãããã±ãŒãžåã test123 ãšããŸãã
test123
âââ test123.py
âââ pyproject.toml
def say_hello():
print("hello world")
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
[project]
name = "test123"
version = "0.0.1"
requires-python = ">=3.7"
4. AWS CodeArtifactã§èªèšŒãè¡ããŸãã
ããã±ãŒãžãã¢ããããŒãããåã«ãAWSãšèªèšŒãè¡ãå¿ èŠããããŸããèªèšŒæ¹æ³ã¯ããã«ãããŒã«ã«ãã£ãŠç°ãªããŸãã
- Twineã¯ãPythonããã±ãŒãžãå ¬éããã®ã«ãã䜿ããããŠãŒãã£ãªãã£ã§ãAWS CodeArtifactã§twineã䜿çšããæ¹æ³ã説æããå ¬åŒããã¥ã¡ã³ãããããŸãã
- PoetryããPythonããã±ãŒãžãäœæ/å ¬éããããã«ãã䜿ãããããŒã«ã§ããå·çæç¹ã§ã¯ãPoetryã«é¢ããAWSããã¥ã¡ã³ãã¯ååšããŸãããããã¡ãã®ããã°èšäºãåèã«ãªããŸãã
以äžã®ã³ãŒãäŸã§ãâäž¡æ¹ã®ããŒã«ã§èªèšŒãè¡ãæ¹æ³ã玹ä»ããŸãã
# éžæè¢(1) ãã°ã€ã³ã³ãã³ãã䜿ã
aws codeartifact login --tool twine --domain <my_domain> --repository test123
# éžæè¢(2) ç°å¢å€æ°ã䜿ã
export TWINE_USERNAME=aws
export TWINE_PASSWORD=`aws codeartifact get-authorization-token --domain <my_domain> --query authorizationToken --output text`
export TWINE_REPOSITORY_URL=`aws codeartifact get-repository-endpoint --domain <my_domain> --repository test123 --format pypi --query repositoryEndpoint --output text`
# Poetryã¯ãã°ã€ã³ã³ãã³ãããªããç°å¢å€æ°ã䜿ãå¿
èŠããã
export CODEARTIFACT_AUTH_TOKEN=`aws codeartifact get-authorization-token --domain <my_domain> --query authorizationToken --output text`
# 圢åŒ: https://<my_domain>-<account_id>.d.codeartifact.<region>.amazonaws.com/pypi/test123/
export CODEARTIFACT_REPOSITORY_URL=`aws codeartifact get-repository-endpoint --domain <my_domain> --repository test123 --format pypi --query repositoryEndpoint --output text`
export CODEARTIFACT_USER=aws
poetry config repositories.test123 $CODEARTIFACT_REPOSITORY_URL
poetry config http-basic.test123 $CODEARTIFACT_USER $CODEARTIFACT_AUTH_TOKEN
macOSã§poetryãBasic HTTPèªèšŒã«å€±æããå Žåããã®GitHub Issueãåèã«ãªããŸãã
5. æåŸã«ãããã±ãŒãžããã«ãããŠå ¬éããŸãã
python3 -m pip install --upgrade build twine
python3 -m build
python3 -m twine upload --repository test123 dist/*
poetry build
poetry publish -r test123
ããã§ãCodeArtifactã«ããã±ãŒãžãå
¬éãããŸããããªããžããªã®è©³çްç»é¢ãéããšãããã±ãŒãžã衚瀺ãããŸããURLãååã«å
±æããŸããããïŒå¿
èŠã«å¿ããŠãã³ã³ããã€ã¡ãŒãžã®ããã«IAMããªã·ãŒã§ããã±ãŒãžãã€ã³ã¹ããŒã«ã§ãããŠãŒã¶ãŒãå¶éã§ããŸããïŒ

ãã©ã€ããŒãPythonããã±ãŒãžãã€ã³ã¹ããŒã«ãã
ãã©ã€ããŒãPythonããã±ãŒãžãæã«å ¥ã£ãã®ã§ãWebã¢ããªã±ãŒã·ã§ã³ãJupyter Notebookãã³ã³ããã€ã¡ãŒãžãLambda颿°ãªã©ã«ã€ã³ã¹ããŒã«ã§ããŸãã
ãã©ã€ããŒãããã±ãŒãžãã€ã³ã¹ããŒã«ããã«ã¯ãããã±ãŒãžãããžã£ãŒã«ããã±ãŒãžã®URLãæããå¿ èŠããããŸããPythonã®å Žåã¯ãpip ããã±ãŒãžãããžã£ãŒã® index-url ã®èšå®ãå¿ èŠã§ããæ¹æ³ã¯ã以äžã®2ã€ããããŸãã
1. (æšå¥š) index-url ãçŽæ¥æå®ãã
pip ã§ã¯ã--index-url ãã©ã¡ãŒã¿ã«ãã©ã€ããŒããªããžããªã® URL ãæå®ã§ããŸããpoetry ã§ã¯ãpyproject.toml ã® source ããããã£ã®èšå®ãå¿
èŠã§ãããããã®å Žåãã€ã³ã¹ããŒã«ã³ãã³ãå®è¡æã«ããã±ãŒãžãååšããªãã£ãããã€ã³ã¹ããŒã«ã倱æããŸãã
2. index-url ã®"ããã©ã«ãå€"ãšããŠãã©ã€ããŒããªããžããªã®URLãèšå®ãã
ãã®å Žåãããã±ãŒãžãããžã£ãŒã¯å
ã«å
¬éãªããžããªã§æ€çŽ¢ããããã±ãŒãžãèŠã€ãããªãã£ãå Žåãæå®ããã第2ã® index-url ã§æ€çŽ¢ããŸããpip ã§ã¯ã--extra-index-url ãã©ã¡ãŒã¿ã®æå®ã§èšå®ã§ããŸããpoetry ã§ã¯ãpyproject.toml ã® secondary ãã©ã°ãèšå®ããŸãã
æªæãæã£ã人ããã©ã€ããŒãããã±ãŒãžãšåãååã®ãããªãã¯ããã±ãŒãžãå
¬éããããšãã§ããŸãããã®ãããpip ã§ããã±ãŒãžãã€ã³ã¹ããŒã«ããéã«ã¯ --extra-index-url åŒæ°ããPoetry ã§ã¯ secondary 屿§ã䜿çšããªãããšãããããããŸãããªããžããªã®æ€çŽ¢é çªãçã£ãæ»æã¯ dependency confusion attack ãšåŒã°ããŸãã
pip ã䜿ãå Žå
以äžã®ã³ãŒãäŸã§ã¯ãAWS CodeArtifact ã«å
¬éãããã©ã€ããŒãããã±ãŒãžã pip ã§ã€ã³ã¹ããŒã«ããŸãã
# 1. èªèšŒããŒã¯ã³ãååŸãã
export CODEARTIFACT_AUTH_TOKEN=`aws codeartifact get-authorization-token --domain <my_domain> --query authorizationToken --output text`
# 2. ã€ã³ã¹ããŒã«æã« --index-url ãã©ã¡ãŒã¿ãæå®ããŸãã
# HTTP BasicèªèšŒã®ãã¹ã¯ãŒãã«ã¯ã(1)ã®ããŒã¯ã³ã䜿çšããŸãã
python3 -m pip install --index-url "https://aws:${CODEARTIFACT_AUTH_TOKEN}@<my_domain>-<account_id>.d.codeartifact.<region>.amazonaws.com/pypi/test123/simple/" test123==0.0.1
ãªã URL ã« /simple/ ãä»ãè¶³ããŠããã®ãïŒ
Pythonããã±ãŒãžãªããžããªã«ã¯ãæ§ã
ãªå®è£
ããããŸããå
¬åŒãªå®è£
ïŒPyPIã䜿çšãããã®ïŒã¯ simple ãšåŒã°ããŸããsimple API ãããšã«äœããããªããžããªã®ããŒã¹URLã¯ã仿§äž /simple/ ã§çµããå¿
èŠããããŸãã詳ãã㯠PEP 503 ãã確èªãã ããã
ããããå€ãã®å ŽåãPythonã¢ããªã±ãŒã·ã§ã³ã®äŸåããã±ãŒãžã requirements.txt ãã¡ã€ã«ã«èšèŒããŸããæ¬¡ã®äŸã§ã¯ãrequirements.txt ãã¡ã€ã«ã« --index-url ãæå®ããæ¹æ³ã玹ä»ããŸãã
# PyPIïŒãããªãã¯ãªããžããªïŒããååŸããããã±ãŒãžãèšèŒãããã¡ã€ã«
requests
# ãã©ã€ããŒããªããžããªããååŸããããã±ãŒãžãèšèŒãããã¡ã€ã«
--index-url https://aws:${CODEARTIFACT_AUTH_TOKEN}@<my_domain>-<account_id>.d.codeartifact.<region>.amazonaws.com/pypi/test123/simple/
test123
pipã§ã¯ãrequirements.txt å
ã§POSIX圢åŒã®ç°å¢å€æ°ïŒäŸ: ${API_TOKEN}ïŒãå©çšã§ããŸãã
poetry (<1.2.0) ã䜿ãå Žå
å·çæç¹ã§ææ° poetry ããŒãžã§ã³ã 1.2 ã§ãããåäœç¢ºèªã§ãã©ã€ããŒãããã±ãŒãžã®ã€ã³ã¹ããŒã«ãæåãã 1.1.15 ãããšã«äºäŸç޹ä»ãããŠããã ããŠããŸãã1.2 以äžã§ã®åäœç¢ºèªãåºæ¥æ¬¡ç¬¬ããã®èšäºã«è¿œèšããŸãã
poetryã§ããã±ãŒãžã管çããŠããã¢ããªã±ãŒã·ã§ã³ã«ããã©ã€ããŒãããã±ãŒãžãã€ã³ã¹ããŒã«ããã«ã¯ããŸã pyproject.toml ãã¡ã€ã«ã« tool.poetry.source ã远å ãããªããžããªåãšURLãæå®ããŸãã
[[tool.poetry.source]]
name = "test123_codeartifact" # name 㯠CodeArtifact ã®ãªããžããªåãšéã£ãŠã倧äžå€«
url = "https://<my_domain>-<account_id>.d.codeartifact.<region>.amazonaws.com/pypi/test123/simple/"
次ã«ãã€ã³ã¹ããŒã«ãããã©ã€ããŒãããã±ãŒãžã® source ããããã£ã« tool.poetry.source ãããã¯ã® name ãèšå®ããŸãã
[tool.poetry.dependencies]
test123 = {version = "^0.0.1", source = "test123_codeartifact"}
requests = "*"
Basic HTTPèªèšŒã§CodeArtifactãšèªèšŒããŸãããã®åŸãpoetry install ãå®è¡ããŠããã¹ãŠã®ããã±ãŒãžãåæã«ã€ã³ã¹ããŒã«ããŸãã
export CODEARTIFACT_AUTH_TOKEN=`aws codeartifact get-authorization-token --domain <my_domain> --query authorizationToken --output text`
export CODEARTIFACT_USER=aws
poetry config http-basic.test123 $CODEARTIFACT_USER $CODEARTIFACT_AUTH_TOKEN
poetry install
ãã©ã€ããŒãããã±ãŒãžå/ããŒãžã§ã³ãPyPIäžã®ãããªãã¯ããã±ãŒãžãšéè€ããå Žåãã€ã³ã¹ããŒã«ã³ãã³ãã¯å€±æããããšããããŸãããã®åé¡ã¯ãããŒã«ã«ã®poetryãã£ãã·ã¥ãåé€ããããšã§è§£æ±ºã§ããŸãã
å®å šäŸ: ã³ã³ããã€ã¡ãŒãžãã«ãæã«ãã©ã€ããŒãããã±ãŒãžãã€ã³ã¹ããŒã«ãã
ã§ã¯ãCIãªã©ã§ã³ã³ããã€ã¡ãŒãžããã«ãããæã«ãã©ã®ããã«ãã©ã€ããŒãããã±ãŒãžãã€ã³ã¹ããŒã«ã§ããã®ã§ããããïŒ
AWS CodeArtifact ãããget-authorization-token APIçµç±ã§èªèšŒæ
å ±ãååŸããŸãããã®éã--duration-seconds ã§èªèšŒæ
å ±ã®æå¹æéãæå®ã§ããŸãããã®ãã©ã¡ãŒã¿ã15åãªã©ã®äœãå€ã«èšå®ãããšããã©ã€ããŒãããã±ãŒãžãã€ã³ã¹ããŒã«ããããã®èªèšŒæ
å ±ããã®ãŸãŸ --build-arg ã§ã³ã³ããã€ã¡ãŒãžã«æž¡ãããšãã§ããã¬ã€ã€ãŒå±¥æŽããé ãå¿
èŠã¯ãããŸããã
export CODEARTIFACT_AUTH_TOKEN=`aws codeartifact get-authorization-token \
+ --duration-seconds 900 \
--domain <my_domain> \
--query authorizationToken \
--output text`
docker build \
--build-arg CODEARTIFACT_USER=aws \
--build-arg CODEARTIFACT_AUTH_TOKEN=$CODEARTIFACT_AUTH_TOKEN \
--tag example \
.
pipã䜿ãå Žå
pipã䜿ã£ãã³ã³ããã€ã¡ãŒãžã®ãã«ãäºäŸã§ããè€æ°ã®ãã©ã€ããŒããªããžããªãããå Žåããªããžããªããšã« requirements-*.txt ãäœæããã€ã¡ãŒãžã§ãã
requests
--index-url https://aws:${CODEARTIFACT_AUTH_TOKEN}@<my_domain>-<account_id>.d.codeartifact.<region>.amazonaws.com/pypi/test123/simple/
test123
FROM python:3.10.6
ARG CODEARTIFACT_USER
ARG CODEARTIFACT_AUTH_TOKEN
COPY requirements.txt requirements-private.txt .
# requirements-private.txt sets the --index-url to AWS CodeArtifact repository URL
RUN pip install -r requirements.txt \
&& pip install -r requirements-private.txt
poetry (<1.2.0) ã䜿ãå Žå
[tool.poetry]
name = "app"
version = "0.1.0"
description = ""
authors = ["example <example@example.com>"]
[[tool.poetry.source]]
name = "test123_codeartifact"
url = "https://<my_domain>-<account_id>.d.codeartifact.<region>.amazonaws.com/pypi/test123/simple/"
[tool.poetry.dependencies]
python = "^3.10"
test123 = {version = "*", source = "test123_codeartifact"}
requests = "*"
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
FROM python:3.10.6
ARG CODEARTIFACT_USER
ARG CODEARTIFACT_AUTH_TOKEN
ARG CODEARTIFACT_REPOSITORY_URL
ENV POETRY_VERSION=1.1.15 \
POETRY_HOME=/usr/local
COPY pyproject.toml poetry.lock .
RUN apt update \
&& apt install -y wget \
&& apt clean \
&& wget https://install.python-poetry.org -O - | python - \
&& poetry config repositories.test123 $CODEARTIFACT_REPOSITORY_URL \
&& poetry config http-basic.test123 ${CODEARTIFACT_USER} ${CODEARTIFACT_AUTH_TOKEN} \
&& poetry install \
&& poetry config --unset http-basic.test
çµããã«
ã¿ãªããã®äŒç€Ÿã§ãã瀟å ã®ã³ãŒããå ±æãããã¿ãŒã³ããäœã£ãŠã¯ãããã§ããããïŒ
ä»å玹ä»ãããããªæ¹æ³ã§ã瀟å ã®éå ¬éã®ã³ãŒããäžéã«å ¬éããããšãªããLambda颿°ãWebã¢ããªã±ãŒã·ã§ã³ãJupyter Notebookãªã©ããã€ã³ã¹ããŒã«ã§ããããã«ãªããŸããéçºè å士ã®ã³ã©ãã¬ãŒã·ã§ã³/ç¥èå ±æããããããªããWin-Winã§ããã
ã³ã³ãããèµ·åããã«ã¯ docker run ããPythonããã±ãŒãžãã€ã³ã¹ããŒã«ããã«ã¯ pip install ãå®è¡ããã®ã¯ãéçºè
ãæ
£ããŠããäœæ¥ãªã®ã§ã瀟å
ã®ã³ãŒãã§ãåãããã«ã€ã³ã¹ããŒã«ããŠäœ¿ããããã«ããŸãããïŒ
åèã«ããèšäº
ç§ãšäžç·ã«åããŸãããïŒ
ENECHANGEæ ªåŒäŒç€Ÿã§ã¯ã倧éãªé»åæç³»åããŒã¿ã®åæãäžå¿ã«ãæ§ã ãªã¢ããªã±ãŒã·ã§ã³äŒç»/éçºãè¡ãªã£ãŠããŸããäŸãã°ããããªããšãã£ãŠããŸãâŠ
- 黿°ã®åžå ŽäŸ¡æ Œã«ãã£ãŠãå®¶é»ãèªåçã«é éæäœããã¢ããªã±ãŒã·ã§ã³éçº
- 倧éã®é»æ°æ¶è²»éããŒã¿ã®ã¯ã©ã¹ã¿ãŒåæãéèŠäºæž¬
- AirflowãæŽ»çšããããŒã¿ãã€ãã©ã€ã³éçº
- AWS Elastic Container Serviceã§1,000以äžã®FargateããŒããæŽ»çšãã忣åŠç
çã ã
åŠç¿ææ¬²ãé«ããæè¡çãªãã£ã¬ã³ãžãã»ããPythonãšã³ãžãã¢ãåéããŠããŸãã
ãã²ã«ãžã¥ã¢ã«é¢è«ã§ãæ°è»œã«è©±ããŸãããã